路由的基础知识:静态路由和动态路由
静态路由
@app.route('/service')
def services():
return 'Service'
动态路由:变量名和参数名要对应。
@app.route('/user/<username>')
def user(username):
return 'username %s' % username
类型匹配(flask中总共提供三种转换器:int(整型) float(浮点型) path(路径,字符串))
@app.route('/user/<int:userid>')
def userid(userid):
return 'username %d' % userid
正则表达式的路由验证实现
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter,self).__init__(url_map)
self.regex=items[0]
app = Flask(__name__)
#将转换器注册到url中
app.url_map.converters['regex'] = RegexConverter
manager = Manager(app)
#测试自定义正则表达式路由
@app.route('/user/<regex("[a-z]{3}"):userid>')
def myregex(userid):
return 'user is %s' % userid
一个视图函数对外提供多个访问的URL
@app.route('/user/<regex("[a-z]{3}"):userid>')
@app.route('/user/<userid>')
def myregex(userid):
return 'user is %s' % userid
控制访问URL的方式:post 、get、put、delete、head、options
POST:
浏览器告诉服务器:想在url上发布新信息并且服务器必须确保数据已经存储且仅仅存储一次这是html表单通常发送数据的方法。
GET:
浏览器告知服务器:只获取页面上的数据并且发给我
这是做常用的方法
PUT:
做更新:这种方式可以在浏览器和服务器之间可以安全的情况下进行第二次接收请求,而不破坏其他东西。POST只做一次所以post不能替代。
DELETE:
删除给定位置的信息
HEAD:头消息
OPTIONS:
给客户端提供一个敏捷的途径来弄清这个URL支持哪些HTTP方法
从flask0.6开始实现了自定义处理。
from flask import render_template
@app.route('/login',methods=['GET','POST'])
def login():
return render_template('login.html',method=request.method)
flask处理请求的生命周期
1、从浏览器发送一个请求到服务端,flask接收这个请求后、这个请求将会由路由系统接收、
2、在路由系统中可以挂入一些钩子(在进入视图函数之前进行一些预处理),然后产生一个request对象
3、从request对象里面我们可以获取一些变量form和cookie及其参数args传入到我们的视图函数中
4、进一步的业务处理
5、视图函数处理完成后将结果返回给页面(一般我们不用直接产生一个response对象自行返回,而是通过redirect、render_teplate这个方法直接输出给flask即可。)通过make_response对象可一直接产生response对象,可以使用response对输出到浏览器的请求做更细致化的一些输出。
request上下文对象:
from flask import Flask
from flask import request
from flask import render_template
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print username
print password
else:
username = request.args['username']
password = request.args['password']
# python变量的作用范围问题
print username
print password
return render_template('login.html',method=request.method)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>登陆</title>
</head>
<body>
<h1>HTTP方法{{ method }}</h1>
<form method="post">
<div>
<input type="text" name="username" placeholder="用户名"/>
</div>
<div>
<input type="password" name="password" placeholder="密码"/>
</div>
<input type="submit"/>
</form>
</body>
</html>
文件上传
from flask import Flask
from flask import request
from flask import render_template
from os import path
from werkzeug.utils import secure_filename
from flask import redirect, url_for
#文件上传
@app.route('/upload',methods=['POST','GET'])
def upload():
if request.method == 'POST':
f = request.files['file']
basepath = path.abspath(path.dirname(__file__))
upload_path = path.join(basepath,'static\\uploads')
f.save(upload_path, secure_filename(f.filename))
return redirect(url_for('upload'))
return render_template('upload.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文件上传</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<p>
<input type="file" name="file"/>
<input type="submit" name="上传"/>
</p>
</form>
</body>
</html>
自动加载代码并推送显示到浏览器
from livereload import Server
# 自动加载代码并推送显示到浏览器
@manager.command
def dev():
live_server = Server(app.wsgi_app)
live_server.watch('**/*.*')
live_server.serve(open_url=True)
异常处理
#定义统一错误页面
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
cookies的应用
from flask import make_response
from flask import abort
# 利用response产生cooike,包装模板
@app.route('/')
def hello():
abort(404)
response = make_response(render_template('index.html', title = '<h1>Hello World!</h1>'))
response.set_cookie('username', 'renbo')
return response