Flask是基于Python,依托jinja2模板和WerkzeugWSGI服务开发的微框架。Werkzeug本质上是一个Socket服务器,用来接收http请求并进行预处理,然后触发flask框架。本文介绍了Python中的Flask框架,感兴趣的朋友可以跟着边肖看看。
Flask是一个用Python编写的web微框架,它允许我们使用Python语言快速实现一个网站或Web服务。本文参考Flask的官方文档,大部分代码引用自官方文档。
安装flask
首先,让我们安装烧瓶。最简单的方法是使用pip。
pip安装烧瓶
然后打开一个Python文件,输入以下内容并运行该文件。然后访问localhost:5000,我们应该在浏览器上看到hello world输出。
从烧瓶进口烧瓶
app=Flask(__name__)
@app.route('/')
def hello_world():
返回“hello world”
if __name__=='__main__ ':
app.run(主机='127.0.0.1 ',端口=5000)
调试模式
我们修改代码中的输出,然后查看浏览器上是否有任何变化。如果你这样做,你可以看到什么都没有改变。其实Flask内置了调试模式,可以自动重新加载代码,显示调试信息。这需要我们打开调试模式。方法很简单。设置FLASK_DEBUG环境变量,并将该值设置为1。或者设置app.debug=True。
从烧瓶进口烧瓶
app=Flask(__name__)
app.debug=True
@app.route('/')
def hello_world():
返回“你好,世界!”
@app.route('/login ')
定义登录():
返回“登录”
if __name__=='__main__ ':
app.run()
然后再次运行该程序,您将看到以下输出。这时,如果你再次修改代码,你会发现这次Flask会自动重启。
*用stat重启
*调试器处于活动状态!
*调试器PIN码:157-063-180
*运行于http://127.0.0.1:5000/(按CTRL C退出)
路由
你可以在上面的例子中看到路由的使用。如果你了解Spring Web MVC,你应该对路由很熟悉。通过使用Flask的app.route decorator设置路由,这与Java注释类似。
@app.route('/')
定义索引():
返回“索引页”
@app.route('/hello ')
def hello():
回复“你好,世界”
路径变量
如果想得到/article/1这样的路径参数,就需要使用路径变量。变量的语法是/path/converter:varname。在path变量之前也可以使用可选的转换器。有以下转换器。
使用string作为转换器的默认选项,接受string int除斜杠接受整数float接受浮点数路径类似于string,但是可以接受string any与斜杠匹配的任何转换器uuid接受UUID字符串。
以下是Flask的官方示例。
@ app . route('/用户/用户名')
def show_user_profile(用户名):
#显示该用户的用户配置文件
返回“用户%s”用户名
@app.route('/post/int:post_id ')
定义show_post(post_id):
#显示给定id的文章,id是一个整数
返回“帖子%d' % post_id
构造URL
在Web程序中,经常需要获取某个页面的URL。在Flask中,需要使用url_for('方法名')来构造对应方法的url。以下是Flask的官方示例。
从烧瓶导入烧瓶,url_for
app=Flask(__name__)
@app.route('/')
.定义索引():通过
.
@app.route('/login ')
.def login():通过
.
@ app . route('/用户/用户名')
.定义配置文件(用户名):通过
.
with app.test_request_context():
.打印url_for('索引')
.打印url_for('登录')
.打印url_for('login ',next='/')
.打印url_for('个人资料',用户名='John Doe ')
.
/
/登录
/登录?下一个=/
/用户/无名氏
HTTP方法
如果需要处理特定的HTTP方法,在Flask中也很容易,只需使用route decorator的methods参数进行设置。
从烧瓶导入请求
@app.route('/login ',methods=['GET ',' POST'])
定义登录():
if request.method=='POST ':
登录()
否则:
显示登录表单()
静态文件
Web程序经常需要处理静态文件。在Flask中,需要使用url_for函数并指定静态端点名和文件名。在下面的示例中,实际的文件应该放在static/文件夹下。
url_for('static ',filename='style.css ')
模板生成
Flask默认使用Jinja2作为模板,Flask会自动配置Jinja模板,所以我们不需要任何其他配置。默认情况下,模板文件需要放在templates文件夹中。
要使用Jinja模板,只需要使用render_template函数,传入模板文件名和参数名即可。
从烧瓶导入渲染模板
@app.route('/hello/')
@app.route('/hello/name ')
def hello(name=None):
返回render_template('hello.html ',name=name)
相应的模板文件如下。
!文档类型html
title来自Flask的hello/title
{% if name %}
h1你好{{ name }}!/h1
{% else %}
h1你好,世界!/h1
{% endif %}
日志输出
Flask为我们预配置了一个记录器,我们可以直接在程序中使用它。这个记录器是一个标准的Python记录器,所以我们可以像配置标准记录器一样配置它。详情请参考官方文档或我的文章Python日志输出。
app.logger.debug('用于调试的值')
app.logger.warning('出现了一个警告(%d个苹果)',42)
app.logger.error('出现错误')
处理请求
需要使用request等几个全局对象来获取Flask中的请求参数,但是这些全局对象比较特殊。它们是上下文局部变量,实际上是Web上下文中局部变量的代理。虽然我们在程序中使用了全局变量,但是它们对于每个请求范围都是不同的变量。明白了这一点,就很简单了。
Request 对象
请求对象是一个全局对象。利用它的属性和方法,我们可以很容易地从页面中获取参数。
method属性返回HTTP方法的相似性,如post和get。表单属性是一个字典。如果数据是POST类型的表单,则可以从form属性中获取。下面是Flask的官方示例,演示了Request对象的方法和表单属性。
从烧瓶导入请求
@app.route('/login ',methods=['POST ',' GET'])
定义登录():
错误=无
if request.method=='POST ':
if valid _ log in(request . form[' username '],
request.form['password']):
返回登录用户(request.form['用户名'])
否则:
错误=“无效的用户名/密码”
#如果请求方法
#是GET或凭据无效
返回render_template('login.html ',error=error)
如果数据是通过GET方法传递的,那么可以通过使用args属性来获取,args属性也是一个字典。
search word=request . args . get(' key ','')
文件上传
Flask也可以用来方便地获取表单中上传的文件,只需使用request的files属性即可,它也是一个包含上传文件的字典。如果想获取上传的文件名,可以使用filename属性,但是需要注意的是,这个属性是可以被客户端更改的,所以不太靠谱。更好的方法是使用werkzeug提供的secure_filename方法来获得安全的文件名。
从烧瓶导入请求
从werkzeug.utils导入安全文件名
@app.route('/upload ',methods=['GET ',' POST'])
def上传文件():
if request.method=='POST ':
f=request.files['the_file']
保存('/var/www/uploads/' secure _ filename(f . filename))
Cookies
Flask也可以方便地处理Cookie。使用方法很简单,看看官方的例子就知道了。下面的例子是如何获取cookie。
从烧瓶导入请求
@app.route('/')
定义索引():
用户名=request.cookies.get('用户名')
#使用cookies.get(key)而不是cookies[key]来避免
#如果cookie不存在,则获取KeyError
如果您需要向客户端发送cookie,请参考以下示例。
从烧瓶导入make_response
@app.route('/')
定义索引():
resp=make_response(渲染模板(.))
resp.set_cookie('用户名','用户名')
退货责任
重定向和错误
再直接的和流产函数用于重定向和返回错误页面。
从烧瓶导入中止,重定向,url_for
@app.route('/')
定义索引():
返回重定向(url_for('login '))
@app.route('/login ')
定义登录():
中止(401)
this_is_never_executed()
默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用错误处理程序装饰器。
从烧瓶导入渲染模板
@app.errorhandler(404)
定义未找到的页面(错误):
返回render _ template(' page _ not _ found。html’),404
响应处理
默认情况下,烧瓶会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用制作_响应函数即可。
@app.errorhandler(404)
定义未找到(错误):
resp=make _ response(render _ template('错误。html’),404)
resp。headers[' X-Something ']=' A value '
退货责任
Sessions
我们可以使用全局对象会议来管理用户会话塞西逊是建立在饼干技术上的,不过在瓶中,我们还可以为会议指定密钥,这样存储在饼干中的信息就会被加密,从而更加安全。直接看瓶官方的例子吧。
从瓶导入烧瓶,会话,重定向,url_for,转义,请求
app=Flask(__name__)
@app.route('/')
定义索引():
如果会话中有"用户名":
“返回”作为% s“%转义”登录(会话["用户名"])
返回"您没有登录"
@app.route('/login ',methods=['GET ',' POST'])
定义登录():
if request.method=='POST ':
会话['用户名]=request.form['用户名]
返回重定向(url_for('index '))
返回'''
表单方法='post '
引脚输入类型=文本名称=用户名
输入类型=提交值=登录
/表单
'''
@app.route('/logout ')
定义注销():
#从会话中删除用户名(如果有)
session.pop('用户名,无)
返回重定向(url_for('index '))
#设置密钥。保守这个秘密:
app。secret _ key=' a0zr 98j/3yX R ~ XHH!jmN]LWX/,RT '
模板简介
这里简单的介绍一下金贾模板的使用方法,详细资料直接看原文档吧。
模板标签
其实金贾模板和其他语言和框架的模板类似,反正都是通过某种语法将超文本标记语言文件中的特定元素替换为实际的值。如果使用过JSP、百里香叶等模板,应该可以非常容易的学会使用金贾模板。
其实从上面的例子中我们应该可以看到金贾模板的基本语法了。代码块需要包含在{% %}块中,例如下面的代码。
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
超大屏幕
氕主页/h1
/div
{% endblock %}
双大括号中的内容不会被转义,所有内容都会原样输出,它常常和其他辅助函数一起使用。下面是一个例子。
一个烧瓶小例子/a
继承
模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。
例如这里有一个layout.html模板,它是整个程序的布局文件。
!文档类型超文本标记语言
超文本标记语言
头
meta charset='UTF-8 '
meta http-equiv=' X-UA-Compatible ' content=' IE=edge '
meta name=' viewport ' content=' width=device-width,initial-scale=1 '
标题{ % block title % } { % end block % }/title
link rel='样式表' href=' { { URL _ for(' static ',filename=' CSS/bootstrap。CSS ')} } ' rel=' external no follow '/
link rel='样式表' href=' { { URL _ for(' static ',filename=' CSS/bootstrap-theme。CSS ')} } ' rel=' external no follow '/
/头
身体
div class='容器主体-内容'
{% block body %}{% endblock %}
/div
div class='容器页脚'
人力资源
p这是页脚/p
脚本src='{{ url_for('static ',filename=' js/jquery。js ')} } '/script
脚本src='{{ url_for('static ',filename=' js/bootstrap . js ')} } '/script
/body
/html
其他模板可以这样写。对比面向对象编程的继承概念,我们就很容易理解了。
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
超大屏幕
H1主页/h1
这个项目演示了Flask的简单使用。单击导航栏上的菜单栏,查看具体功能。/p
/div
{% endblock %}
控制流
条件可以这样写,类似于JSP标签里的Java代码,Python代码也可以用{%%}写。下面是官方Flask文档的一个例子。
div class=metanav
{% if not session.logged_in %}
a href=' { { URL _ for(' log in ')} } ' rel=' external no follow '登录/a
{% else %}
a href=' { { URL _ for(' logout ')} } ' rel=' external no follow '注销/a
{% endif %}
/div
如果循环的话,可以这样写,类似于Python中的遍历。
tbody
{% for key,value in data.items() %}
tr
td{{ key }}/td
td{{ value }}/td
/tr
{% endfor %}
tr
Td文件/td
td/td
/tr
/tbody
请注意,并不是所有的Python代码都可以在模板中编写。如果要从模板中引用其他文件的函数,需要在模板中显式注册这些函数。可以参考这个栈爆来提问。
写在最后
本文主要参考了Flask的官方文档,但只介绍了Flask最基础的部分。了解了这部分,我们就可以用Python搭建一个小服务器来做一些事情了。如果想了解更多关于烧瓶的用法,请关注更详细的信息。这篇文章就是抛砖引玉的效果。
顺便也通过Flask了解了一下Python语言的执行速度。众所周知,编译器编译出来的代码比解释器解释出来的代码大约快几十到几千倍。以前学Java的时候,觉得Java慢。主要原因是等待编译的时间太长了。相对来说,用Python写脚本是块,因为没有编译过程。
但是从Flask的运行速度来看,个人感觉Python执行真的不算快。例如,在Spring中编写一个接受HTTP参数并在页面上显示它们的控制器。如果是编译程序,显示过程基本是瞬间的。但是在Flask中同样的需求,我其实可以感受到明显的延迟(大约几百毫秒的等待时间)。所以,如果你想写一个更快的Web程序,最好用Java或者JVM语言,虽然性能确实不错。
关于Python的flask框架的详细解释,本文到此结束。有关Python的Flask框架的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。