Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。今天编程学习网和大家聊聊flask框架的安装流程以及对框架的整体介绍,希望对大家有所帮助!一起和小编看看详细内容吧!
安装flask
首先我们来安装Flask。最简单的办法就是使用pip。
1
|
pipinstallflask
|
然后打开一个Python文件,输入下面的内容并运行该文件。然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world。
1
2
3
4
5
6
7
|
fromflaskimportFlask
app=Flask(__name__)
@app.route('/')
defhello_world():
return'hello world'
if__name__=='__main__':
app.run(host='127.0.0.1',port=5000)
|
调试模式
我们修改代码中的输出,然后查看浏览器上是否有变化。如果你照做的话,可以看到什么变化都没有。其实Flask内置了调试模式,可以自动重载代码并显示调试信息。这需要我们开启调试模式,方法很简单,设置FLASK_DEBUG环境变量,并将值设置为1。或者设置app.debug=True
1
2
3
4
5
6
7
8
9
10
11
12
|
fromflaskimportFlask
app=Flask(__name__)
app.debug=True
@app.route('/')
defhello_world():
return'Hello World!'
@app.route('/login')
deflogin():
return'Login'
if__name__=='__main__':
app.run()
|
然后再次运行程序,会看到有这样的输出。这时候如果再次修改代码,会发现这次Flask会自动重启。
* Restarting with stat
* Debugger is active!
* Debugger PIN: 157-063-180
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
路由
在上面的例子里可以看到路由的使用。如果了解Spring Web MVC的话,应该对路由很熟悉。路由通过使用Flask的app.route装饰器来设置,这类似Java的注解。
1
2
3
4
5
6
7
|
@app.route('/')
defindex():
return'Index Page'
@app.route('/hello')
defhello():
return'Hello, World'
|
路径变量
如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/<converter:varname>。在路径变量前还可以使用可选的转换器,有以下几种转换器。
转换器 | 作用 |
---|---|
string | 默认选项,接受除了斜杠之外的字符串 |
int | 接受整数 |
float | 接受浮点数 |
path | 和string类似,不过可以接受带斜杠的字符串 |
any | 匹配任何一种转换器 |
uuid | 接受UUID字符串 |
下面是Flask官方的例子。
1
2
3
4
5
6
7
8
9
|
@app.route('/user/<username>')
defshow_user_profile(username):
# show the user profile for that user
return'User %s'%username
@app.route('/post/<int:post_id>')
defshow_post(post_id):
# show the post with the given id, the id is an integer
return'Post %d'%post_id
|
构造URL
在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
>>>fromflaskimportFlask, url_for
>>> app=Flask(__name__)
>>> @app.route('/')
...defindex():pass
...
>>> @app.route('/login')
...deflogin():pass
...
>>> @app.route('/user/<username>')
...defprofile(username):pass
...
>>> with app.test_request_context():
... printurl_for('index')
... printurl_for('login')
... printurl_for('login',next='/')
... printurl_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe
|
HTTP方法
如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。
1
2
3
4
5
6
7
8
|
fromflaskimportrequest
@app.route('/login', methods=['GET','POST'])
deflogin():
ifrequest.method=='POST':
do_the_login()
else:
show_the_login_form()
|
静态文件
Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。
1
|
url_for('static', filename='style.css')
|
模板生成
Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。
使用 Jinja 模板,只需要使用render_template函数并传入模板文件名和参数名即可。
1
2
3
4
5
6
|
fromflaskimportrender_template
@app.route('/hello/')
@app.route('/hello/<name>')
defhello(name=None):
returnrender_template('hello.html', name=name)
|
相应的模板文件如下。
1
2
3
4
5
6
7
|
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
|
日志输出
Flask 为我们预配置了一个 Logger,我们可以直接在程序中使用。这个Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它。
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
处理请求
在 Flask 中获取请求参数需要使用request等几个全局对象,但是这几个全局对象比较特殊,它们是 Context Locals ,其实就是 Web 上下文中局部变量的代理。虽然我们在程序中使用的是全局变量,但是对于每个请求作用域,它们都是互不相同的变量。理解了这一点,后面就非常简单了。
Request 对象
Request 对象是一个全局对象,利用它的属性和方法,我们可以方便的获取从页面传递过来的参数。
method属性会返回HTTP方法的类似,例如post和get。form属性是一个字典,如果数据是POST类型的表单,就可以从form属性中获取。下面是 Flask 官方的例子,演示了 Request 对象的method和form属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fromflaskimportrequest
@app.route('/login', methods=['POST','GET'])
deflogin():
error=None
ifrequest.method=='POST':
ifvalid_login(request.form['username'],
request.form['password']):
returnlog_the_user_in(request.form['username'])
else:
error='Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
returnrender_template('login.html', error=error)
|
如果数据是由GET方法传送过来的,可以使用args属性获取,这个属性也是一个字典。
1
|
searchword=request.args.get('key', '')
|
文件上传
利用Flask也可以方便的获取表单中上传的文件,只需要利用 request 的files属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug提供的secure_filename方法来获取安全的文件名。
1
2
3
4
5
6
7
8
|
fromflaskimportrequest
fromwerkzeug.utilsimportsecure_filename
@app.route('/upload', methods=['GET','POST'])
defupload_file():
ifrequest.method=='POST':
f=request.files['the_file']
f.save('/var/www/uploads/'+secure_filename(f.filename))
|
Cookies
Flask也可以方便的处理Cookie。使用方法很简单,直接看官方的例子就行了。下面的例子是如何获取cookie。
1
2
3
4
5
6
7
|
fromflaskimportrequest
@app.route('/')
defindex():
username=request.cookies.get('username')
# 使用 cookies.get(key) 代替 cookies[key] 避免
# 得到 KeyError 如果cookie不存在
|
如果需要发送cookie给客户端,参考下面的例子。
1
2
3
4
5
6
7
|
fromflaskimportmake_response
@app.route('/')
defindex():
resp=make_response(render_template(...))
resp.set_cookie('username','the username')
returnresp
|
重定向和错误
redirect和abort函数用于重定向和返回错误页面。
1
2
3
4
5
6
7
8
9
10
|
fromflaskimportabort, redirect, url_for
@app.route('/')
defindex():
returnredirect(url_for('login'))
@app.route('/login')
deflogin():
abort(401)
this_is_never_executed()
|
默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用errorhandler装饰器。
1
2
3
4
5
|
fromflaskimportrender_template
@app.errorhandler(404)
defpage_not_found(error):
returnrender_template('page_not_found.html'),404
|
响应处理
默认情况下,Flask会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用make_response函数即可。
1
2
3
4
5
|
@app.errorhandler(404)
defnot_found(error):
resp=make_response(render_template('error.html'),404)
resp.headers['X-Something']='A value'
returnresp
|
Sessions
我们可以使用全局对象session来管理用户会话。Sesison 是建立在 Cookie 技术上的,不过在 Flask 中,我们还可以为 Session 指定密钥,这样存储在 Cookie 中的信息就会被加密,从而更加安全。直接看 Flask 官方的例子吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
fromflaskimportFlask, session, redirect, url_for, escape, request
app=Flask(__name__)
@app.route('/')
defindex():
if'username'insession:
return'Logged in as %s'%escape(session['username'])
return'You are not logged in'
@app.route('/login', methods=['GET','POST'])
deflogin():
ifrequest.method=='POST':
session['username']=request.form['username']
returnredirect(url_for('index'))
return'''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
@app.route('/logout')
deflogout():
# remove the username from the session if it's there
session.pop('username',None)
returnredirect(url_for('index'))
# set the secret key. keep this really secret:
app.secret_key='A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
|
模板简介
这里简单的介绍一下Jinja 模板的使用方法,详细资料直接看原文档吧。
模板标签
其实Jinja 模板和其他语言和框架的模板类似,反正都是通过某种语法将HTML文件中的特定元素替换为实际的值。如果使用过JSP、Thymeleaf 等模板,应该可以非常容易的学会使用 Jinja模板。
其实从上面的例子中我们应该可以看到Jinja 模板的基本语法了。代码块需要包含在{% %}块中,例如下面的代码。
1
2
3
4
5
6
7
8
|
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
<div class="jumbotron">
<h1>主页</h1>
</div>
{% endblock %}
|
双大括号中的内容不会被转义,所有内容都会原样输出,它常常和其他辅助函数一起使用。下面是一个例子。
1
|
<a class="navbar-brand" href={{ url_for('index') }}>Flask小例子</a>
|
继承
模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。
例如这里有一个layout.html模板,它是整个程序的布局文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<metahttp-equiv="X-UA-Compatible"content="IE=edge">
<metaname="viewport"content="width=device-width, initial-scale=1">
<title>{% block title %}{% endblock %}</title>
<linkrel="stylesheet"href="{{ url_for('static',filename='css/bootstrap.css') }}"rel="external nofollow"/>
<linkrel="stylesheet"href="{{ url_for('static',filename='css/bootstrap-theme.css') }}"rel="external nofollow"/>
</head>
<body>
<divclass="container body-content">
{% block body %}{% endblock %}
</div>
<divclass="container footer">
<hr>
<p>这是页脚</p>
<scriptsrc="{{ url_for('static',filename='js/jquery.js') }}"></script>
<scriptsrc="{{ url_for('static',filename='js/bootstrap.js') }}"></script>
</body>
</html>
|
其他模板可以这么写。对比一下面向对象编程的继承概念,我们可以很容易的理解。
1
2
3
4
5
6
7
8
9
|
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
<div class="jumbotron">
<h1>主页</h1>
<p>本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。</p>
</div>
{% endblock %}
|
控制流
条件判断可以这么写,类似于JSP标签中的Java 代码,{% %}中也可以写Python代码。下面是Flask官方文档的例子。
1
2
3
4
5
6
7
|
<div class=metanav>
{% if not session.logged_in %}
<a href="{{ url_for('login') }}" rel="external nofollow" >log in</a>
{% else %}
<a href="{{ url_for('logout') }}" rel="external nofollow" >log out</a>
{% endif %}
</div>
|
循环的话可以这么写,和在Python中遍历差不多。
1
2
3
4
5
6
7
8
9
10
11
12
|
<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框架用什么语言?Python flask框架详细解答!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/10234/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料