怎么在python中使用Flask实现一个登录功能

这期内容当中小编将会给大家带来有关怎么在python中使用Flask实现一个登录功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

整体结构图:

怎么在python中使用Flask实现一个登录功能

首先是配置信息,配置了数据库连接等基本的信息,config.py

DEBUG=True
SQLALCHEMY_ECHO=False
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:1011@localhost/rl_project?charset=utf8'
SECRET_KEY='*\xff\x93\xc8w\x13\x0e@3\xd6\x82\x0f\x84\x18\xe7\xd9\\|\x04e\xb9(\xfd\xc3'

common/_init_.py

#config=utf-8
fromflask_sqlalchemyimportSQLAlchemy

__all__=['db']

db=SQLAlchemy()

数据库配置类,common/data.py

#config=utf-8

fromsqlalchemyimportcreate_engine

fromsqlalchemy.sqlimporttext

fromconfigimportSQLALCHEMY_DATABASE_URI,SQLALCHEMY_ECHO





defdb_query(sql,settings=None,echo=None):



ifsettingsisNone:

settings=SQLALCHEMY_DATABASE_URI



ifechoisNone:

echo=SQLALCHEMY_ECHO



returncreate_engine(settings,echo=echo).connect().execute(text(sql)).fetchall()





defdb_execute(sql,settings=None,echo=None):



ifsettingsisNone:

settings=SQLALCHEMY_DATABASE_URI



ifechoisNone:

echo=SQLALCHEMY_ECHO



returncreate_engine(settings,echo=echo).connect().execute(text(sql)).rowcount

SQLALCHEMY_DATABASE_URI用于连接数据的数据库。

SQLALCHEMY_ECHO如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。当然,我们在setting中设置了基本的连接数据库信息,启动时加载app = create_app('../config.py'),所以这个类删掉也不会报错。

form/login_form.py

#config=utf-8

fromflask_wtfimportFlaskFormasForm

fromwtformsimportStringField,PasswordField

fromwtforms.validatorsimportDataRequired





classLoginForm(Form):

accountNumber=StringField('accountNumber',validators=[DataRequired('accountNumberisnull')])

password=PasswordField('password',validators=[DataRequired('passwordisnull')])

使用Flask-WTF做登录的表单验证,这里简单做了账号密码不为空如,当我们不填写密码时,点击登录:

怎么在python中使用Flask实现一个登录功能

model/_init_.py

#config=utf-8
fromflaskimportFlask
fromflask_loginimportLoginManager
fromcommonimportdb
login_manager=LoginManager()

login_manager.login_view="user.login"

defcreate_app(config_filename=None):

app=Flask(__name__)

login_manager.init_app(app)
ifconfig_filenameisnotNone:

app.config.from_pyfile(config_filename)

configure_database(app)
returnapp

defconfigure_database(app):
db.init_app(app)

其中,login_manager.login_view = "user.login" 指定了未登录时跳转的页面,即被拦截后统一跳到user/login这个路由下model/user_model.py

#config=utf-8

fromflask_loginimportUserMixin
fromcommonimportdb
classUser(db.Model,UserMixin):

user_id=db.Column('id',db.Integer,primary_key=True)

accountNumber=db.Column(db.String(200),unique=True)

password=db.Column(db.String(50),unique=True)

name=db.Column(db.String(20),unique=True)

__tablename__='tb_user'

def__init__(self,user_id=None,account_number=None,password=None,name="anonymous"):
self.user_id=user_id

self.accountNumber=account_number

self.password=password

self.name=name
defis_authenticated(self):

returnTrue
defis_active(self):

returnTrue

defis_anonymous(self):

returnFalse

defget_id(self):

returnunicode(self.user_id)

def__repr__(self):

return'<User%r>'%(self.accountNumber)

这里需要注意:

defget_id(self):
returnunicode(self.user_id)

该方法不可缺少,否则会报:NotImplementedError: No `id` attribute - override `get_id`错误。

get_id()

返回一个能唯一识别用户的,并能用于从 user_loader 回调中 加载用户的 unicode 。注意着 必须 是一个 unicode ——如果 ID 原本是 一个 int 或其它类型,你需要把它转换为 unicode 。

is_authenticated()

当用户通过验证时,也即提供有效证明时返回 True

is_active()

如果这是一个通过验证、已激活、未被停用的账户返回 True 。

is_anonymous()

如果是一个匿名用户,返回 True 。

login.py  

#encoding:utf-8

#!/usr/bin/envpython

fromflaskimportrender_template,request,redirect,Flask,Blueprint

fromflask_loginimportlogin_user,login_required

frommodel.user_modelimportUser

frommodelimportlogin_manager

fromform.login_formimportLoginForm





userRoute=Blueprint('user',__name__,url_prefix='/user',template_folder='templates',static_folder='static')



@login_manager.user_loader

defload_user(user_id):

returnUser.query.get(int(user_id))





@userRoute.before_request

defbefore_request():

pass



@userRoute.route('/success')

@login_required

defindex():

returnrender_template('success.html')



@userRoute.route('/login',methods=['GET','POST'])

deflogin():

form=LoginForm()

ifrequest.method=='POST':

ifnotform.validate_on_submit():

printform.errors

returnrender_template('login.html',form=form)



user=User.query.filter(User.accountNumber==form.accountNumber.data,

User.password==form.password.data).first()

ifuser:

login_user(user)

returnrender_template('success.html')



returnrender_template('login.html',form=form)

其中,要实现一个load_user()回调方法,这个回调用于从会话中存储的用户 ID 重新加载用户对象,id存在则返回对应的用户对象,不存在则返回none。

有些操作是需要用户登录的,有些操作则无需用户登录,这里使用到了@login_required,在每一个需要登录才能访问的路由方法上加@login_required即可。

启动类,runserver.py

#config=utf-8

fromloginimportuserRoute

frommodelimportcreate_app

DEFAULT_MODULES=[userRoute]

app=create_app('../config.py')

formoduleinDEFAULT_MODULES:

app.register_blueprint(module)


@app.before_request

defbefore_request():

pass

if__name__=='__main__':

app.run(debug=True)

DEFAULT_MODULES = [userRoute]是将userRoute蓝图注册入app,才能启动login中的userRoute路由,我们在login.py中使用了蓝图:userRoute = Blueprint('user', __name__, url_prefix='/user', template_folder='templates', static_folder='static')

@app.before_request

defbefore_request():

pass

这是一个全局的方法,在请求开始之前被调用,在某些场景下做一些提示或者特殊处理,当然这里没用上,直接pass,这个方法去掉对项目没有影响。基本样式模版,base.html

<!DOCTYPEhtml>

<htmllang="cn">

<head>

<metacharset="UTF-8">

<title>{%blocktitle%}{%endblock%}</title>

<scriptsrc="{{url_for('static',filename='jquery1.42.min.js')}}"></script>

{%blockhead%}{%endblock%}

</head>

<body>

{%blockcontent%}{%endblock%}

</body>

</html>

登录前台页面,login.html

{%extends"base.html"%}

{%blocktitle%}pythonflaskuserpage{%endblock%}

{%blockhead%}

<styletype="text/css"></style>

{%endblock%}

{%blockcontent%}

<formaction="{{url_for('user.login')}}"method="post">

{%ifform.errors%}

<ul>

{%forname,errorsinform.errors.items()%}

{%forerrorinerrors%}

<li>{{error}}</li>

{%endfor%}

{%endfor%}

</ul>

{%endif%}

账号:{{form.accountNumber(size=20)}}<label>{{form.accountNumber.errors[0]}}</label><br/>

密码:<inputname="password"type="password"/><br/>

{{form.hidden_tag()}}

<buttontype="submit">登录</button>

</form>

{%endblock%}

上述就是小编为大家分享的怎么在python中使用Flask实现一个登录功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-04-08 13:37:21
收藏
分享
海报
0 条评论
162
上一篇:使用Java怎么计算文本的MD5加密值 下一篇:怎么在小程序中实现一个点赞收藏功能
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码