flask view

1.      flask view

1.1.    @route

写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户

from functools import wraps

from flask import session, abort

def login_required(func):

@wraps(func)

def decorated_function(*args, **kwargs):

if not 'user' in session:

abort(401)

return func(*args, **kwargs)

return decorated_function

app.secret_key = '12345678'

需将此装饰器加在每个需要验证登录的请求方法上即可

注意,必需加在route方法后

@app.route('/admin')

@login_required

def admin():

return '<h1>Admin Dashboard</h1>'

1.2.    add_url_rule

可以直接添加路由。

def fun_view():
    return '<h1>view
function test!</h1>'

app.add_url_rule('/viewfun', view_func=fun_view)

验证一下效果:

可以查看app的路由参数:

Map([<Rule '/viewfun' (HEAD, GET, OPTIONS)
-> fun_view>,

直接访问也可以

http://127.0.0.1:9000/viewfun

装饰器本质上是一个闭包函数,可以把它当函数使用:

app.add_url_rule('/foo', view_func=login_required(views.foo))

1.3.   
pluggable view

之前的视图都是函数,但它也可以通过类来实现:

  1. 标准类视图必须继承自flask.views.View
  2. 必须实现dispatch_request方法,以后请求过来以后,会执行这个方法。这个方法的返回值就相当于是之前的函数视图一样,也必须返回Request或者子类的对象(字符串或者元组)。
  3. 必须是通过app.add_url_rule(rule,endpoint,view_func)来做url映射。

view_func这个参数,要使用as_view这个方法来转换

如果指定了endpoint,那么在使用url_for反转的时候,就要使用endpoint指定的那个值,如果没有指定那个值,就使用as_view中指定的视图名字来作为反转。

类视图有以下的好处,可以将一些共性的东西抽取出来放到父视图中,子视图直接继承就可以了,但是也不是说所有的视图都要使用类视图,这个要根据实际情况来定。

class Plugview1(View):
    def dispatch_request(self, **kw):
        text = '这里是pluggable
test页面。'
       
return render_template('plug_view.html', text1=text, name=kw['name'])

from .views import Plugview1
view_t = Plugview1.as_view('plugview')
app.add_url_rule('/plugview/', view_func=view_t)
app.add_url_rule('/plugview/<name>', view_func=view_t)

我们创建了一个”flask.views.View”的子类,并覆盖了其”dispatch_request()”函数,渲染视图的主要代码必须写在这个函数里。然后我们通过”as_view()”方法把类转换为实际的视图函数,”as_view()”必须传入一个唯一的视图名。此后,这个视图就可以由”app.add_url_rule”方法绑定到路由上了。

效果展示:Map([<Rule '/plugview/' (HEAD, OPTIONS, GET) -> plugview>,

这个例子比较简单,只是为了介绍怎么用视图类,体现不出它的灵活性,我们再看个例子:指定模板

class RenderTemplateView(View):

def __init__(self,
template):

self.template =
template

def
dispatch_request(self):

return
render_template(self.template)

app.add_url_rule('/hello',
view_func=RenderTemplateView.as_view('hello', template='hello-view.html'))

app.add_url_rule('/login',
view_func=RenderTemplateView.as_view('login', template='login-view.html'))

1.3.1.  
装饰器

视图装饰器支持

class HelloView(View):
    decorators = [login_required]
 
    def dispatch_request(self, name=None):
        return render_template('hello-view.html', name=name)

只需将装饰器函数加入到视图类变量”decorators”中即可。它是一个列表,所以能够支持多个装饰器,并按列表中的顺序执行。

1.3.2. 请求方法的支持

当视图要同时支持GET和POST请求时,视图类可以这么定义:

class MyMethodView(View):
    methods = ['GET', 'POST']
 
    def dispatch_request(self):
        if request.method == 'GET':
            return '<h1>Hello World!</h1>This is GET method.'
        elif request.method == 'POST':
            return '<h1>Hello World!</h1>This is POST method.'
 
app.add_url_rule('/mmview', view_func=MyMethodView.as_view('mmview'))

只需将需要支持的HTTP请求方法加入到视图类变量”methods”中即可。没加的话,默认只支持GET请求。

1.3.3. 基于方法的视图

上节介绍的HTT对于RESTFul类型的应用来说,有没有更简单的方法,比如省去那些if, else判断语句呢?Flask中的”flask.views.MethodView”可以。

from flask.views import MethodView
 
class UserAPI(MethodView):
    def get(self, user_id):
        if user_id is None:
            return 'Get User called, return all users'
        else:
            return 'Get User called with id %s' % user_id
 
    def post(self):
        return 'Post User called'
 
    def put(self, user_id):
        return 'Put User called with id %s' % user_id
 
    def delete(self, user_id):
        return 'Delete User called with id %s' % user_id

现在我们分别定义了get, post, put, delete方法来对应四种类型的HTTP请求,注意函数名必须这么写。怎么将它绑定到路由上呢?

user_view = UserAPI.as_view('users')
# 将GET /users/请求绑定到UserAPI.get()方法上,并将get()方法参数user_id默认为None
app.add_url_rule('/users/', view_func=user_view, 
                            defaults={'user_id': None}, 
                            methods=['GET',])
# 将POST /users/请求绑定到UserAPI.post()方法上
app.add_url_rule('/users/', view_func=user_view, 
                            methods=['POST',])
# 将/users/<user_id>URL路径的GET,PUT,DELETE请求,
# 绑定到UserAPI的get(), put(), delete()方法上,并将参数user_id传入。
app.add_url_rule('/users/<user_id>', view_func=user_view, 
                                     methods=['GET', 'PUT', 'DELETE'])

上例中”app.add_url_rule()”可以传入参数default,来设置默认值;参数methods,来指定支持的请求方法。

如果API多,有人觉得每次都要加这么三个路由规则太麻烦,可以将其封装个函数:

def register_api(view, endpoint, url, pk='id', pk_type='int'):
    view_func = view.as_view(endpoint)
    app.add_url_rule(url, defaults={pk: None},
                     view_func=view_func,
methods=['GET', ])
    app.add_url_rule(url, view_func=view_func,
methods=['POST', ])
    app.add_url_rule('%s<%s:%s>'
% (url, pk_type, pk), view_func=view_func,
                     methods=['GET', 'PUT', 'DELETE'])

from .views import UserAPI
register_api(UserAPI, 'user_api', '/users/', pk='user_id')

现在,一个”register_api()”就可以绑定一个API了

<Rule '/users/' (OPTIONS, POST) ->
user_api>,

<Rule '/users/<user_id>' (GET,
PUT, DELETE, OPTIONS, HEAD) -> user_api>,

<Rule '/users/' (GET, OPTIONS, HEAD) ->
user_api>])

flask view的更多相关文章

  1. flask 即插视图(Pluggable Views)和endpoint

    endpoint经常使用flask的人肯定不会面生.其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意. url_for看源码感觉实现挺复杂的,我们姑且不在这里 ...

  2. Flask框架的学习与实战(三):登陆管理

    继续flask的学习之旅.今天介绍flask的登陆管理模块,还记得上一篇中的blog小项目么,登录是咱们自己写的验证代码,大概有以下几个步骤: 1.在登录框中输入用户名和密码 2.flask view ...

  3. wtforms 使用

    wtforms是一个表单模板库, 下面以修改密码表单为例简单说明其用法. 我们可以用python代码定义form的基本元素, 比如用户名/邮箱, 并给定各个元素的validation条件. 然后在re ...

  4. 使用pygal 做chart图的经验分享

    看到小芮介绍了pygal文章后, http://rfyiamcool.blog.51cto.com/1030776/1378400, 我一直搞数据工作, 所以对于这种数据的展现很有兴趣. 做了点研究, ...

  5. 【Flask】报错解决方法:AssertionError: View function mapping is overwriting an existing endpoint function: main.user

    运行Flask时出现了一个错误, AssertionError: View function mapping is overwriting an existing endpoint function: ...

  6. Flask之endpoint错误View function mapping is overwriting an existing endpoint function: ***

    最近在学习Flask, 其中遇到了一个错误, 发现这个问题和Flask, 路由有关系, 所以就记了下来 错误代码: from flask import Flask, render_template, ...

  7. [flask初学问题]RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/

    看B站视频学习flask-SQLalchemy时,报错RuntimeError: No application found. Either work inside a view function or ...

  8. Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.

    背景 有一个 Flask 项目,然后有一个路由返回的是 dict 通过浏览器访问,结果报错 关键报错信息 TypeError: 'dict' object is not callable The vi ...

  9. python 运行出现flask运行时提示出错了或者报服务器出错,ValueError: View function did not return a response

    python manage.py runserver -d

随机推荐

  1. 【原】linux增加开机自启动脚本

    在rc.local脚本中添加开机自启动程序

  2. Linux - CentOS7 命令行快捷键简介

    1. 概述 CentOS7 下输入命令的一些快捷键 2. 快捷键 1. 移动 单个字符 ctrl + b/f 单个单词 alt + b/f 行首行尾 ctrl + a/e 2. 编辑 删除单个字符 c ...

  3. 基于Robot Framework的接口自动化测试

    Robot Framework框架简介 Robot Framework框架是一个通用的验收测试和验收测试驱动开发的自动化测试框架(ATDD),使用的是关键字驱动的测试方法.它本身拥有强大的标准库,此外 ...

  4. java.util.Properties类,保存时保留注释及格式不变

    原文地址:http://blog.csdn.net/benbenxiongyuan/article/details/53006097 参考地址:http://www.iteye.com/topic/1 ...

  5. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  6. SpringBoot 开发的那些小趣事儿

    经过这次在公司实习中获取到的经历,我发现确实有时候书本上的知识发挥的作用微乎其微,好像是被问题打了太极拳一样,你明明想去攻克这个地方,他却给你报了其他地方的错误. 平常的一些小项目根本就不能匹配到企业 ...

  7. 使用Log4net记录日志(非常重要)

    使用Log4net记录日志   首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志 ...

  8. HeroM2连击技能设置和DB完整数据

    连击技能设置: M2\选项\功能设置\技能魔法\通用技能\连击技能 魔法DB: 81;倚天辟地;0;55;5;10;10;5;6;6;99;15;5;15;10;15;15;60;; 300;万剑归宗 ...

  9. Booth算法: 补码一位乘法公式推导与解析

    以下讲解内容出自<计算机组成原理(第三版)>(清华大学出版社) 大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth ...

  10. 攻防世界 web 新手练习 刷题记录

    1.view_source 既然让看源码,那就F12直接就能看到. 2.robots 先百度去简单了解一下robots协议 robots协议(robots.txt),robots.txt文件在网站根目 ...