前面说了flask框架的基础用法,现在说一下Flask框架的进阶用法: #包引入 from flask import Flask,redirect,url_for,render_template,request,make_response,send_file,abort,flash, get_flashed_messages,Blueprint,views from os import urandom app = Flask(__name__) @app.route('/admin') def hello_admin(): return 'Hello Admin' @app.route('/guest/<guest>') def hello_guest(guest): return 'Hello %s as Guest' % guest #重定向 @app.route('/user/<name>') def user(name): if name =='admin': return redirect(url_for('hello_admin')) else: return redirect(url_for('hello_guest',guest = name)) #模板引擎 @app.route('/htmltest') def html_temp(): dic = {"firts": 1, "second": 2, "thired": 3} return render_template('test.html', result=dic) #自定错误页面 @app.errorhandler(404) def errorhandler(e): return render_template("404.html"), 404 #辅助方法 @app.route('/home') def home(): print('cookies:', request.cookies) # 获取cookies print('headers:', request.headers) # 获取请求头信息 print('method:', request.method) # 请求方法 print('url:', request.url) # URL全部内容,请求地址加参数 print('url_rule:', request.url_rule) # 请求URL不含请求地址和参数 print('url_root:', request.url_root) # 请求地址 print('host_url:', request.host_url) # 与url_root类似 print('base_url:', request.base_url) # 请求地址和URL和,不含参数 print('path:', request.path) # 请求URL print('values:', request.values) # 包含GET, POST请求的参数 print('args:', request.args) # 获取URL参数 print('form:', request.form) # 获取POST提交formdata的参数 print('files:', request.files) # 获取提交的文件 print('json:', request.json) # 获取header为applicaiton/json提交的数据 return 'home page' # 用于创建响应对象。它通常用于在视图函数中设置响应的内容、状态码和头部 @app.route('/page1') def page1(): resp = make_response('<h1>hello world</h1>') resp.headers['name'] = 'hello' return resp #解除进程对SIGABRT信号的阻止,然后向调用进程发送该信号(阻止当去请求,跳转制定的状态) @app.route('/page2') def page2(): abort(405) # 从服务器端发送内存中的文件给客户端 @app.route('/page3') def page3(): return send_file('test.jpg') #闪现(在视图函数调用flash()函数,传入消息内容,flash()函数把消息存储在session中,我们需要在模板中使用全局函数get_flashed_messages()获取消息并将它显示出) #注意:app.secret_key = urandom(25) ;flash消息存储在session中,一定要设置key值,相当于一个栈,访问一次/page4,相当于"hello","world","welcome"入栈一次,所以可以看到再次访问/page5,入栈的数据就会增加一次 #获取随机数(获取不同操作系统特定提供的随机源, 它可以被用来做随机加密的key使用) app.secret_key = urandom(25) @app.route('/page4') def page4(): flash('hello') flash('world') flash('welcome', 'success') return 'page4 page' @app.route('/page5') def page5(): print(get_flashed_messages()) return 'page5 page' # 蓝图(路由组件,相当于路由分组组件,相当于Golang中的group) # 定义 api = Blueprint('api', 'api') admin = Blueprint('admin', 'admin') # 相当于/api/page6(api相当于模块) @api.route('/page6') def page6(): return 'api page6' # 相当于/admin/page7(admin相当于模块) @admin.route('/page7') def page7(): return 'admin page7' # 注册 app.register_blueprint(api) app.register_blueprint(admin) #钩子函数(类似于php的laravel框架中的handle) @app.route('/page8') def page8(): return 'page8' @app.route('/page9') def page9(): return 'page9' @app.before_request def first_request(): print('请求进入视图函数之前') @app.after_request def after_request(response): print('视图函数结束之前调用') return response #cbv(装饰器:类似 restful API:相当于利用request.method去判断是页面还是操作,cbv就相当于集成版) class Index(views.MethodView): def get(self): return 'get method page' def post(self): return 'post method page' class Upload(views.MethodView): methods = ['GET', 'POST'] def get(self): return """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"> </form> </body> </html>
def post(self):
file = request.files['file']
file.save(file.filename)
return 'upload successful'
app.add_url_rule('/index', view_func=Index.as_view(name='index'))
app.add_url_rule('/upload', view_func=Upload.as_view(name='upload'))
if __name__ == '__main__':
app.run()