《Flask Web 开发》中比较大的更新就是用Flask Shell来替代了Flask-Script这个插件。原来用来启动网站服务器的命令也有所改变了
以windows powershell为例:
- 启动服务器有先设定环境变量
#启动服务器:
$env:FLASK_APP="Flask"
#启动调试模式:
$env:FLASK_DEBUG=1
Flask Web 开发服务器也可以通过编程的方式启动:调用 app.run()
方法。在
没有 flask
命令的旧版 Flask
中,若想启动应用,要运行应用的主脚本。主
脚本的尾部包含下述代码片段:
if __name__ == '__main__':
app.run()
2.数据库更新
flask db migrate
flask db upgrade
-
flask shell
进入shell
模式
(venv) PS E:\Flask> flask shell
Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] on win32
App: app [production]
Instance: E:\Flask\instance
>>>
-
current_user
示例 8-10 app/templates/base.html:导航栏中的 Log In 和 Log Out 链接
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated %}
<li><a href="{{ url_for('auth.logout') }}">Log Out</a></li>
{% else %}
<li><a href="{{ url_for('auth.login') }}">Log In</a></li>
{% endif %}
</ul>
判断条件中的变量 current_user
由 Flask-Login
定义,在视图函数和模板中自动可用。这
个变量的值是当前登录的用户,如果用户未登录,则是一个匿名用户代理对象。
Flask-Login要求实现的属性和方法
is_authenticated
: 如果用户提供的登录凭据有效,必须返回 True,否则返回 False
-
next = request.args.get('next')
提交登录凭据的 POST 请求最后也做了重定
向,不过目标 URL 有两种可能。用户访问未授权的 URL 时会显示登录表单,Flask-Login
会把原 URL 保存在查询字符串的next
参数中,这个参数可从request.args
字典中读取。如果查询字符串中没有next
参数,则重定向到首页。next
参数中的 URL 会经验证,确保是相对 URL,以防恶意用户利用这个参数,把不知情的用户重定向到其他网站。
自己理解
目标URL有两种可能
(1)没有参数,重定向回到首页
(2)访问没有授权的URL,返回原地址(当前地址)
_get_current_object()
@main.route('/', methods=['GET', 'POST'])
def index():
form = PostForm()
if current_user.can(Permission.WRITE) and form.validate_on_submit():
post = Post(body=form.body.data,
author=current_user._get_current_object())
db.session.add(post)
db.session.commit()
return redirect(url_for('.index'))
posts = Post.query.order_by(Post.timestamp.desc()).all()
return render_template('index.html', form=form, posts=posts)
新文章对象的author
属性值为表达式current_user._get_current_object()
.变量current_user
由Flask-Login
提供,和所有上下文变量一样,也是通过线程内的代理对象实现.这个对象的表现类似用户对象,但实际上却是一个轻度包装,包含真正的用户对象。数据需要真正的用户对象,因此要调用_get_current_object()
方法。
7.模板中include()
指令
{% include '_posts.html' %}
网友评论