Python Flask框架用法完全攻略
Flask 框架是 Python 中一个比较重要的框架,在开发网站中极具优势,下面对 Flask 框架的功能进行具体介绍。
在 Flask 中,route( ) 装饰器会把一个函数绑定到 URL 上,具体代码如下:
这种方式将参数直接传递给函数,也可以指定参数的类型,格式为<converter:variable_name>。Flask 传递参数,具体代码如下:
转换器类型如表 1 所示。
构造 URL 的代码如下:
具体代码如下:
当访问到
具体代码如下:
注意:render_template( ) 调用之后的 404。这告诉 Flask,该页面的错误代码是 404,即没有找到。默认代码是 200,表示一切正常。
具体代码如下:
在网络应用中,通常将 Session 称为“会话控制”。Session 对象存储特定用户所需的属性及配置信息(存储在服务器端)。存储在 Session 对象中的变量不会丢失,而会在整个会话中一直存在下去。Session 是在 Cookie 的基础上实现的,并且对 Cookie 进行密钥签名,这意味着用户可以查看 Cookie 的内容,但不可以修改,除非知道签名的密钥。
Session 的设置与操作,具体代码如下:
除上述设置密钥的方法外,还可以使用如下方法进行设置,
第一个模板 index.html,具体代码如下:
下面来看看是怎么使用这些模板的,具体代码如下:
模板中的判断条件与循环语句使模板变得更加智能,采用 {%...%} 符号将判断条件括起来。
判断条件的使用,具体代码如下:
循环语句的使用,具体代码如下:
使用循环语句与判断条件同理,只需使用 render_template( ) 函数传递对应的参数即可实现。
文件上传,具体代码如下:
FIask框架的第一个程序——Hello World
Flask 框架的第一个程序,具体代码如下:from flask import Flask #引入Flask app = Flask(__name__) #创建一个Flask实例 @app.route('/') #将网址映射到这个函数上 def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() #入口,执行把该程序保存为 hello.py 或者其他,但不要与 flask.py 产生冲突。这样,通过访问 http://127.0.0.1:5000/,就会看见“Hello World!”问候。
FIask框架的应用
1) 路由
路由是在 MVC 架构下 Web 网站框架中一个很重要的概念,表示通过用户请求的 URL 找出其对应的处理函数。在 Flask 中,route( ) 装饰器会把一个函数绑定到 URL 上,具体代码如下:
@app.route('/index') def index(): return 'index page!'这样,在访问 /index 时,页面上就会显示出“index page!”字样。不仅如此,还可以通过构建路由传递参数。
这种方式将参数直接传递给函数,也可以指定参数的类型,格式为<converter:variable_name>。Flask 传递参数,具体代码如下:
@app.route('/user/<int:id>') def show_id(id): return 'id_type:'+type(id)
转换器类型如表 1 所示。
转换器类型 | 说明 |
---|---|
int | 接收整数 |
float |
同int,但是接收浮点数
|
path | 和默认的相似,但也接收斜线 |
2) 构造URL
Flask 不仅可以匹配到对应的 URL,也可以生成 URL。使用 url_for( ) 函数,不仅可以接收函数名字作为第一个参数,也可以接收 URL 规则中的变量作为参数传入。构造 URL 的代码如下:
from flask import Flask,url_for app=Flask(__name__) @app.route('/') def index(): pass @app.route('/example') def index2(): pass @app.route('/example/<username>') def index3(username): return url_for(index) with app.test_request_context(): print(url_for('index')) print(url_for('index2')) print(url_for('index3', username='abc'))输出结果如下:
/
/example
/example/abc
3) 请求处理之request库
request 库中的方法,具体代码如下:from flask import request #导入 request 库 request.args.get ("key") #用于获取请求的URL中的参数key的值 request.form.get ("key", type=str, default=None) # 用于获取表单中传入的参数 request.values.get ("key") #用于获取所有参数 request.respond #用于获取其请求方式
4) 重定向、跳转与错误
跳转多用于旧网址在废弃前转向新网址,以保证用户的访问,表示页面的永久性转移。而重定向表示页面的展示性转移,通常使用 Flask 下的 redirect( ) 方法来实现。具体代码如下:
from flask import Flask, request, redirect, url_for app=Flask(__name__) @app.route('/') def index(): return redirect(url_for('index2')) @app.route('/index2') def index2(): return 'index2' def index3(): abort(404) app.run(port=5001, debug=True)
当访问到
/
目录时,自动跳转到 /index 下 abort 的使用:在代码中使用 abort(code) 会放弃请求并返回错误代码 code,之后的语句不会再执行。在默认情况下,错误代码会显示一个黑白的错误页面。如果要定制错误页面,则可以使用 errorhandler( ) 装饰器。具体代码如下:
from flask import render_template @app.errorhandler(404) def page_not_found(error): return render_template('page not found.html'), 404
注意:render_template( ) 调用之后的 404。这告诉 Flask,该页面的错误代码是 404,即没有找到。默认代码是 200,表示一切正常。
5) GET和POST请求传参
GET 和 POST 请求传参,具体代码如下:@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': #如果请求的方式是POST,则执行如下函数 login() else : #否则执行如下函数 cancel()在默认情况下,路由只回应 GET 请求,但是可以通过修改 route( ) 方法中的 methods 参数来改变这个行为。
6) Cookie与Session在FIask中的使用
Cookie 是存储在用户本地终端上的数据,通常是指某些网站为了辨别用户身份,进行 Session 跟踪而存储在用户本地终端上的数据(通常经过加密)。接下来展示如何在 Flask 中设置及删除 Cookie。具体代码如下:
from flask import request app=Flask(__name__) @app.route('/') def index(): username = request.cookies.get('username') #设置 Cookie @app.route('/') def index(): resp = make_response("hello world") resp.set_cookie('username', 'the username') return resp #删除 Cookie def index(): resp = make_response("hello world") #实质上就是将览期时间设置为0 resp.set_cookie('username', 'the username', expires=0) return resp
在网络应用中,通常将 Session 称为“会话控制”。Session 对象存储特定用户所需的属性及配置信息(存储在服务器端)。存储在 Session 对象中的变量不会丢失,而会在整个会话中一直存在下去。Session 是在 Cookie 的基础上实现的,并且对 Cookie 进行密钥签名,这意味着用户可以查看 Cookie 的内容,但不可以修改,除非知道签名的密钥。
Session 的设置与操作,具体代码如下:
from flask import Flask, session, redirect, url_for, request app = Flask(__name __) @app.route('/') def index(): if 'username' in session: #获取 Session 中的 username return T Logged in as %s' % session['username'] return 'Hi,You are not logged in' @app.route('/login', methods=['GET' , 'POST']) def login(): if request.method == 'POST': #将表单中传入的username作为Session中的username传入 session['username'] = request.form.get('username1) return redirect(url_for(1 index 1)) return ''' <form action="" method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form> ''' @app.route('/logout') def logout(): #在 Session 中删除username,实际上就是设置其为空 session.pop('username', None) return redirect(url_for ('index') ) #跳转回 index 页面 app.config['SECRET_KEY']='123456' #设置密钥 app.run(port=5001, debug=True)
除上述设置密钥的方法外,还可以使用如下方法进行设置,
app.secret_key = 'A0Zr98j/3yX R~XHH! jmN] LWX/,?RT'/example
7) 模板中的判断条件与循环语句
在 Python 中生成 HTML 实际上是一个很烦琐的过程,不过,在 Flask 中配置好了 Jinja2 模板,避免了这一烦琐的过程。模板可以保持应用程序与网页的布局或界面逻辑是分开的,这样会更加容易组织。第一个模板 index.html,具体代码如下:
<html> <head> <title>{{title}}</title> </head> <body> <h1>Hi, {{user.name}}!</h1> </body> </html>可以看到,模板中的标签内容由
{{}}
代替,这样就可以实现变量的传入。下面来看看是怎么使用这些模板的,具体代码如下:
from flask import render_template from app import app @app.route('/') @app.route(1/index 1) def index(): user = {'name': 'mark'} return render_template ("index.html", title = 'Home', user = user)render_template( ) 函数的第一个参数指定了网页,后面两个参数指定了模板中需要渲染的变量,这样就实现了一个易分离、易控制的网页。
模板中的判断条件与循环语句使模板变得更加智能,采用 {%...%} 符号将判断条件括起来。
判断条件的使用,具体代码如下:
<html> <head> {% if title %} #判断title变量是否存在 <title>{{title}}</title> {% else %} #如果不存在 <title>Hi,</title> { % endif %} #结束判断 </head> <body> <h1>Hi, {{user.name}}!</h1> </body> </html>
循环语句的使用,具体代码如下:
<html> <head> <title>learnflask</title> </head> <body> <h1>Hi, {{user.name}}!</h1> {% for content in contents %} <p>{{content}}</b></p> {% endfor %} </body> </html>
使用循环语句与判断条件同理,只需使用 render_template( ) 函数传递对应的参数即可实现。
8) 文件上传
Flask 中的文件上传是利用 request.files 实现的,使用时一定要记得设置 enctype="multipart/form-data" 属性,否则浏览器不会发送文件。文件上传,具体代码如下:
from flask import request,Flask app=Flask(__name__) @app.route('/upload', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': f = request.files['file'] #获取到上传的文件 #保存到C盘下,并命名为uploaded_file.txt f.save('C:\\uploaded_file.txt *) return * you have successed in uploading! * return ''' <form action="" method="post” enctype ="multipart/form-data"> <p><input type=file name=file> <p><input type=submit value=上传> </form> app.run (port=10000, debug=True)