flask判断是否登录,flask登录注册表单验证

  flask判断是否登录,flask登录注册表单验证

  用户认证原则

  在我们知道如何使用Flask实现用户认证之前,首先要了解用户认证的原理。现在假设我们想自己实现用户认证,需要做什么?

  首先,用户需要能够输入用户名和密码,所以需要网页和表单来实现用户输入和提交的过程。

  当用户提交用户名和密码时,我们需要比较用户名和密码是否正确。要对比的话,首先我们的系统里必须有存放用户名和密码的地方。大部分后端系统会通过数据库存储,但实际上,我们可以简单地将它们存储在文件中。

  登录后,我们需要维护用户的登录状态,以便用户在访问特定网页时,判断自己是否已经登录,是否有权限访问修改后的网页。需要维护一个会话来保存用户的登录状态和用户信息。

  从第三步我们也可以看到,如果我们的网页需要权限保护,那么当请求来临时,我们首先要检查用户的信息,比如是否登录过,是否有权限等等。如果检查通过,相应的网页将作为响应回复给请求用户,但是如果检查失败,将返回一条错误消息。

  在第二步中,我们知道需要存储用户名和密码。但如果只是简单地将用户名和密码明文存储,很容易被“有心人”窃取,造成用户信息的泄露。所以我们实际上应该加密用户信息,尤其是密码,然后安全存储。

  用户登录

  登录过程由Flask和相应的插件实现。

  接下来如何通过Flask框架和相应的插件实现整个登录过程,需要用到的插件如下:

  烧瓶-wtf

  世界跆拳道联盟

  工具

  flask _登录

  使用flask-wtf和wtf实现表单功能

  Flask-wtf封装了wtf,但是有些东西还是需要直接使用wtf,比如StringField。Flask-wtf和wtf主要用于建立html中的元素和Python中的类的对应关系,通过操作Python代码中相应的类和对象来控制html中的元素。我们需要使用python代码中的flask-wtf和wtf来定义首页的表单(实际上是定义一个表单类),然后将对应的表单对象作为render_template函数的参数传递给对应的模板。之后,Jinja模板引擎会将相应的模板渲染成html文本,并作为http响应返回给用户。

  定义表单类的示例代码:

  fromflask_wtfimportFlaskForm

  fromwtformsimportStringField,BooleanField,PasswordField

  fromwtforms . validatorsimportdata必需

  #所有定义的表单都需要从FlaskForm继承。

  classLoginForm(FlaskForm):

  #初始化域时,第一个参数是设置label属性。

  username=StringField(UserName ,validators=[DataRequired()])

  Password=Password field( Password ,validators=[DataRequired()])

  Remember _ me=布尔字段(记住我,默认值=false)。在wtf中,每个字段代表html中的一个元素。例如,StringField表示输入type=text 元素。当然,wtf的域也定义了一些特定的函数,比如验证器。你可以通过验证器检查这个域的数据。详情请参考wtf教程。

  对应的html模板可以是如下的login.html:

  {%extendslayout.html%}

  超文本标记语言

  头

  标题登录页面/标题

  /头

  身体

  for action= { { URL _ for( log in )} } quo

  t;method="POST">

  <p>

  UserName:<br>

  <inputtype="text"name="username"/><br>

  </p>

  <p>

  Password:</br>

  <inputtype="password"name="password"/><br>

  </p>

  <p>

  <inputtype="checkbox"name="remember_me"/>RememberMe

  </p>

  {{form.csrf_token}}

  </form>

  </body>

  </html>这里{{ form.csrf_token }}也可以使用{{ form.hidden_tag() }}来替换

  同时我们也可以使用form去定义模板,跟直接用html标签去定义效果是相同的,Jinja模板引擎会将对象、属性转化为对应的html标签,
相对应的template,如下login.html:

  

{%extends"base.html"%}

现在我们需要在view中定义相应的路由,并将相应的登录界面展示给用户。
简单起见,将view的相关路由定义放在主程序当中

 

  

@app.route('/login')

这里简单起见,当用户请求'/login'路由时,直接返回login.html网页,注意这里的html网页是经过Jinja模板引擎将相应的模板转换后的html网页。

 

  至此,如果我们把以上代码整合到flask当中,就应该能够看到相应的登录界面了,那么当用户提交之后,我们应当怎样存储呢?这里我们暂时先不用数据库这样复杂的工具存储,先简单地存为文件。接下来就看下如何去存储。

  加密和存储

  我们可以首先定义一个User类,用于处理与用户相关的操作,包括存储和验证等。

  

fromwerkzeug.securityimportgenerate_password_hash

User类需要继承flask-login中的UserMixin类,用于实现相应的用户会话管理。这里我们是直接存储用户信息到一个json文件"profiles.json"我们并不直接存储密码,而是存储加密后的hash值,在这里我们使用了werkzeug.security包中的generate_password_hash函数来进行加密,由于此函数默认使用了sha1算法,并添加了长度为8的盐值,所以还是相当安全的。一般用途的话也就够用了。验证password的时候,我们需要使用werkzeug.security包中的check_password_hash函数来验证密码get_id是UserMixin类中就有的method,在这我们需要overwrite这个method。在json文件中没有对应的user id时,可以使用uuid.uuid4()生成一个用户唯一id。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: