视图示例

@app.route('/hello')
def hello():
return 'Hello World' if __name__ == '__main__':
app.run()

特殊的装饰器

1. before_request   # 在所有视图函数执行前执行

2. after_request  # 在所有视图函数执行后执行

    示例:
from flask import Flask
app = Flask(__name__) @app.before_request
def x1():
print('before:x1')
return '滚' @app.before_request
def xx1():
print('before:xx1') @app.after_request
def x2(response):
print('after:x2')
return response @app.after_request
def xx2(response):
print('after:xx2')
return response @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run() 3. before_first_request # 在视图函数第一次执行之前执行,只执行一次 from flask import Flask
app = Flask(__name__) @app.before_first_request
def x1():
print('123123') @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run() 4. template_global    # 定义全局的函数 可以被任意模板调用 5. template_filter    # 定义一个模板filter 6. errorhandler      # 页面错误的时候会执行此函数
@app.errorhandler(404)
def not_found(arg):
print(arg)
return "没找到"

给视图函数加装饰器的注意事项

如果按照正常的写法直接在视图函数上加装饰器@wrapper,则会报错,这是因为加完装饰器之后,原函数名就改变了。

报错信息:

 AssertionError: View function mapping is overwriting an existing endpoint function: inner
 

在@app.route的情况下增加装饰器的写法:

from flask import Flask,request,render_template,redirect,session,url_for,views
from flask import render_template app = Flask(__name__) #实例化flask对象
app.debug = True #能够随时更改自动重启,不加的话每次更改代码需要手动重启
app.config['SECRET_KEY'] = '123456' #secret_key,用于给session加密 @app.route('/login',methods=['GET','POST'],endpoint='t1') #endpoint是url的别名,相当于django中Url的name
def login():
if request.method == "GET":
# res = request.query_string
# print(res) 获取通过GET请求url传过来的参数
return render_template('login.html')
else:
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'tom' and pwd == '123':
session['userinfo'] = user #设置session
return render_template('hello.html')
return render_template('login.html', error='用户名或密码错误') def wapper(func):
def inner(*args,**kwargs):
user = session.get('user_info')
if not user:
return redirect('/login')
return func(*args,**kwargs)
return inner @app.route('/detail/<int:nid>',methods=['GET'],endpoint='n1')
@wapper
def detail(nid):
print(nid)
return render_template('hello.html')
'''
如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
''' if __name__ == '__main__':
app.run()

  

另一种写法:

import functools
def wapper(func):
@functools.wraps(func)
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
'''
functools.wraps()相当于保留元信息
说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,
因为加了装饰器,效果等同于inner=inner(detail()),
如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-
其函数的名字得以保留。
''' @wapper
def detail():
pass print(detail.__name__)

  

flask的get_flashed_messages,flash

from flask import Flask,get_flashed_messages,flash
app = Flask(__name__)
app.secret_key = 'asdf'
@app.route('/get')
def get():
data = get_flashed_messages()
print(data)
return 'Hello world' @app.route('/set')
def set():
flash('info info')
'''
闪现效果,相当于set视图函数执行2次,会在一个列表中存储两个flash函数的内容,
当执行get_flashed_messages的时候则会取出该列表,并清空,类似字典的Pop。
具体用处不大。。。
'''
return 'Hello world' if __name__ == '__main__':
app.run()

  

flash还可以通过category参数给Flash内容归类,通过不同类别取不同内容。

 
 
 

Flask之视图函数的更多相关文章

  1. flask 在视图函数里操作数据库

    在视图函数里操作数据库 在视图函数里操作数据的方式和在python shell中的联系基本相同,只不过需要一些额外的工作.比如把查询结果作为参数 传入模板渲染出来,或是获取表单的字段值作为提交到数据库 ...

  2. flask 在视图函数中验证表单

    在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求.所以我们要根据请求方法的不同执行不同的代码.具体来说,首先是实例化表单,如果是GET请求,就渲 ...

  3. flask之视图函数从前端接收数据的方法

    一:从前端接收查询字符串  query-string 注意:get和post都可以在url后面添加查询字符串?a=1&b=2 测试工具:postman 1:get方式接收 视图函数 from ...

  4. flask 视图函数的使用

    flask框架 视图函数当中 各种实用情况简单配置 1 建立连接 2 路由参数 3 返回网络状态码 4 自定义错误页面 5 重定向 6 正则url限制 和 url 优化 7 设置和获取cookie # ...

  5. Flask之视图(一)

    2.关于Flask 知识点 从Hello World开始 给路由传递参数 返回状态码 重定向 正则URL 设置cookie和获取cookie 扩展 上下文 请求钩子 Flask装饰器路由的实现 Fla ...

  6. Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  7. Flask视图函数报fmalformed url rule错误的原因

    Flask视图函数报fmalformed url rule错误,原因可能是包含中文字符了 把标点符号都重新写一遍英文格式的,可能就不会报这个了

  8. Flask如何给多个视图函数增加装饰器

    这几天在学习Flask, 遇到了些小问题,比如说怎么给多个视图函数加相同的装饰器 给单独一个视图函数加装饰器的话很简单,写一个装饰器,然后直接加在原装饰器下面即可,多个的话,会报这样一个错误: 这个异 ...

  9. Flask视图函数与普通函数的区别,响应对象Response

    视图函数与普通函数看似没什么区别,其实他们的返回值上有着很大的区别. from flask import Flask app = Flask(__name__) @app.route('/hello' ...

随机推荐

  1. 一款纯css3实现的tab选项卡

    今天给大家带来一款纯css3实现的tab选项卡.单击左侧的选项的时候,右侧内容以动画的形式展示.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=&quo ...

  2. boost准模板库内存管理中pool和object_pool的使用

    首先,在敲代码之前,必须改动一个问题.要不然,无法链接: boost安装文件夹:D:\boost.       找到D:\boost\boost_1_55_0\include\boost-1_55\b ...

  3. saveFileDialog对话框

    private void button1_Click(object sender, EventArgs e) { saveFileDialog1.Filter = "*.txt|*.txt| ...

  4. 使用OpenFace进行人脸识别(2)

    http://blog.csdn.net/u011531010/article/details/52270023 http://www.vccoo.com/v/2ed520 第一步 在 openfac ...

  5. 【MySql】脚本备份数据库

    #!/bin/bash #this is a script of mysql backup #Mysql="mysql" #MysqlDump="mysqldump&qu ...

  6. jQuery补充,基于jQuery的bxslider轮播器插件

    基于jQuery的bxslider轮播器插件 html <!DOCTYPE html> <html lang="zh-cn"> <head> & ...

  7. 【NOIP模拟题】Graph(tarjan+dfs)

    似乎我搞得太复杂了? 先tarjan缩点然后dfs就行了QAQ. (我不说我被一个sb错调了半个小时....不要以为缩点后dfs就可以肆无忌惮的不加特判判vis了.. bfs的做法:减反图,然后从大到 ...

  8. 小结:单调栈 & 单调队列

    概要: 对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列. 技巧及注意: 技巧很多,只要能将问题转化为单调性问题,就好解决了. 当维护固定长度的单调 ...

  9. jenkins发布docker到mesos

    1.前提是装好git.SSH.maven插件 2.jenkins新建一个项目,配好git拉取代码.maven编译构建(gradle构建也行,这不重要) 3.SSH Server,填写需要传输的jar文 ...

  10. WPF进阶之接口(2):IDisposable,ICollectionView

    废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; using System.ComponentModel; // 下面的例子将展示一个实施了I ...