跳转到下一页的这个概念很简单 。比方说我们需要你登录才能导航到一个页面,但你现在并未登录 。在Flask-Login中你可以通过login_required装饰器来限定未登录用户 。如果一个用户想连接到一个限定的url,那么他将被自动的重定向到login页面 。Flask-Login将保存最初的url作为下一个页面 , 一旦登录完成我们便跳转到这个页面 。
做这个工作Flask-Login需要知道用户当前在那个页面 。我们可以在app的初始化组件里配置它(app/__init__.py):
lm = LoginManager()
lm.setup_app(app)
lm.login_view = 'login'
全局变量g.user
如果你注意力很集中,那么你应该记得在login view方法中我们通过检查g.user来判断一个用户是否登录了 。为了实现这个我们将使用Flask提供的before_request事件 。任何一个被before_request装饰器装饰的方法将会在每次request请求被收到时提前与view方法执行 。所以在这儿来设置我们的g.user变量(app/views.py):
@app.before_request
def before_request():
g.user = current_user
这就是它要做的一切,current_user全局变量是被Flask-Login设定的,所以我们只需要把它拷贝到更容易被访问的g变量就OK了 。这样,所有的请求都能访问这个登录的用户,甚至于内部的模板 。
index视图
在之前的章节中我们用假代码遗留了我们的index视图,因为那个时候我们系统里并没有用户和博客文章 。现在我们有用户了,所以 , 让我们来完成它吧:
@app.route('/')
@app.route('/index')
@login_required
def index():
user = g.user
posts = [
{
'author': { 'nickname': 'John' },
'body': 'Beautiful day in Portland!'
},
{
'author': { 'nickname': 'Susan' },
'body': 'The Avengers movie was so cool!'
}
]
return render_template('index.html',
title = 'Home',
user = user,
posts = posts)
在这个方法中只有两处变动 。首先,我们增加了login_required装饰器 。这样表明了这个页面只有登录用户才能访问 。
另一个改动是把g.user传给了模板,替换了之间的假对象 。
现在可以运行我们的应用了 。
当我们连接到你将会看到登陆页面 。记着如果你通过OpenID登录那么你必须使用你的提供者提供的OpenID URL 。你可以下面URL中的任何一个OpenID provider来为你产生一个正确的URL 。
作为登录进程的一部分,你将会被重定向到OpenID提供商的网站 , 你将在那儿认证和授权你共享给我们应用的一些信息(我们只需要email和nickname,放心,不会有任何密码或者其他个人信息被曝光) 。
一旦登录完成你将作为已登录用户被带到index页面 。
试试勾选remember_me复选框 。有了这个选项当你在浏览器关闭应用后重新打开时,你还是已登录状态 。
注销登录
我们已经实现了登录 , 现在是时候来实现注销登录了 。
注销登录的方法灰常简单(file app/views.py):
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
但我们在模板中还没有注销登录的链接 。我们将在base.html中的顶部导航栏添加这个链接(file app/templates/base.html):
html
head
{% if title %}
title{{title}} - microblog/title
{% else %}
titlemicroblog/title
{% endif %}
/head
body
divMicroblog:
a href="https://www.04ip.com/post/{{ url_for('index') }}"Home/a
{% if g.user.is_authenticated() %}
| a href="https://www.04ip.com/post/{{ url_for('logout') }}"Logout/a
{% endif %}
/div
hr
{% with messages = get_flashed_messages() %}
{% if messages %}
推荐阅读
- jsp中java代码块,jsp java代码
- iosgba4ios怎么下游戏下载游戏,苹果4s怎么下载b站
- 精灵射击的街机游戏名字,精灵射击的街机游戏名字叫什么
- 快手李北音直播回放,李北音资料
- 关于vb.net号意思的信息
- 如何用命令连接sqlserver数据库,如何在命令窗口连接mysql数据库?
- 腾讯篮球直播视频素材,腾讯视频篮球比赛
- 学linux命令作用 linux命令总结及心得
- 关于flutter控件靠右约束不生效的信息