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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。