Flask--视图函数

函数视图

  • 定义
  • 被url装饰的==>后面处理逻辑的方法就是视图函数
  • 视图函数的形式
  • 同一函数处理单数和复数
  • 同一函数处理GET/POST等多种方式请求
  • 根据使用习惯,可以一个视图处理1个或多个逻辑
# 使用127.0.0.1:5000/ware访问全部项目信息
# 使用127.0.0.1:5000/ware?id=2获取单个项目信息
# 使用post 方法创建
@app.route('/ware', methods=['GET', 'POST'])
def ware():
    id = request.args.get('id')
    if request.method == 'GET':     # get方法
        if id is None:
            return 'all ware info'  # 复数,全部信息
        return f'ware info: {id}'   # 单数, 单个信息
    elif request.method == 'POST':  # post方法
        if id is None:
            return 'Ceate a ware'

类视图

  • 优点
  • 类可继承
  • 代码复用
  • 可以定义多个函数
标准类视图
  • 约束
  • 类需要继承自Flask.views.View
  • 需要重写dispatch_request方法,否则报错NotImplementedError
  • as_view()意思是将类转成视图函数用,接收一个name参数,定义视图函数名,或者说定义端点名(端点默认取视图函数名)
  • 只能用add_url_rule注册路由
  • 方法
  • methods: 定义支持的请求方法
  • dispatch_request: 请求分发
  • decorators: 自定义装饰器,元组或列表形式的类变量,存放装饰器的顺序与视图函数的顺序一致
  • 示例
from flask import Flask, url_for, redirect, request
from flask.views import View

app = Flask(__name__)


class Ware(View):
    # methods = ['GET', 'POST']
    def dispatch_request(self):
        return '{}'.format(request.method)

# Map([<Rule '/' (OPTIONS, POST) -> ware>
app.add_url_rule('/', view_func=Ware.as_view('ware'), methods=['POST'])


if __name__ == '__main__':
    app.run(debug=True)
  • 不同请求分发
class Ware(View):
    methods = ['GET', 'POST']       

    def get(self):
        return 'get'

    def post(self):
        return 'post'

    def dispatch_request(self):
        dispatch_pattern = {'get': self.get, 'post': self.post}
        method = request.method.lower()
        return dispatch_pattern.get(method)()


app.add_url_rule('/', view_func=Ware.as_view('ware'))
  • 类视图装饰器
def decorater(func):
    pass

class Ware(View):
    decorators = (deco,)   # 装饰器,顺序同视图函数顺序
    pass

app.add_url_rule('/', view_func=Ware.as_view('ware'))
请求类视图
  • 定义
  • 基于请求方法的类视图, 是根据请求的"method"来执行不同的方法, 若用户是发送的"get"请求, 那么将会执行这个类的"get"方法, 其他的"method"方法类似, 如: “post”, “delete”, “put”
  • 约束
  • 类需要继承Flask.views.MethodView
  • 需要定义对应的请求方法,否则报错Method Not Allowed
  • 注册方式和标准类视图是相同的
  • 自定义装饰器与标准类视图是相同的
  • 不需要重写dispatch_request,仅在需要拓展时重写
  • 不需要通过"request.method=="GET"来判断请求方式,父类通过getattr(self, request.method.lower(), None)获取
  • MethodView源码
class MethodView(with_metaclass(MethodViewType, View)):
    """A class-based view that dispatches request methods to the corresponding
    class methods. For example, if you implement a ``get`` method, it will be
    used to handle ``GET`` requests. ::

        class CounterAPI(MethodView):
            def get(self):
                return session.get('counter', 0)

            def post(self):
                session['counter'] = session.get('counter', 0) + 1
                return 'OK'

        app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter'))
    """

    def dispatch_request(self, *args, **kwargs):
        meth = getattr(self, request.method.lower(), None)

        # If the request method is HEAD and we don't have a handler for it
        # retry with GET.
        if meth is None and request.method == "HEAD":
            meth = getattr(self, "get", None)

        assert meth is not None, "Unimplemented method %r" % request.method
        return meth(*args, **kwargs)
  • 示例
class UserVIew(MethodView):
    def get(self, project_id):
        if project_id is None:
            return 'Get All Project'
        return f'Get {project_id}'

    def post(self, project_id):
        return f'Post {project_id}'

    def put(self, project_id):
        return f'Put {project_id}'
    
    def delete(self, project_id):
        return f'Delete {project_id}'


f = UserVIew.as_view('user')
app.add_url_rule('/projects/<project_id>', view_func=f, methods=['GET', 'POST', 'PUT', 'DELETE'])
app.add_url_rule('/projects/', view_func=f, defaults={'project_id': None}, methods=['GET'])

传参形式

  • 通过斜杠传递参数
  • 传统视图函数,常用于前后端不分离的项目
@app.route('/<id>') # http://127.0.0.1:5000/1
def hello(id):
	return f'hello {id}'
  • 通过?表单传递参数
@app.route('/', methods=['GET'])  # http://127.0.0.1:5000/?id=1
def hello():
    if request.method == 'GET':
        id = request.args.get('id')
        return f'hello {id}'

返回值类型

  • String
@app.route('/h')
def h():
    return 'hello' # String
  • render_template
@app.route('/he')
def he():
    return render_template('index.html') # render_template
  • jsonify
@app.route('/hel')
def hel():
    return  jsonify({'a':1})   # jsonify
  • tuple
@app.route('/hell')
def hell():
    # 返回元组时,顺序依次是:返回内容,返回状态码,返回的header
    return 'hello world', 200, {'Locateion':'www.baidu.com'}  # tuple
  • make_response对象
@app.route('/hello')
def hello():
    response = make_response('hello')   # make_response对象
    response.headers = {'Location':'abc'}
    return response
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flask-Login是一个用于处理用户认证和会话管理的Flask扩展。它提供了一些有用的功能,例如登录、登出、身份验证保护的视图等。 使用Flask-Login,你可以轻松地实现用户认证系统,包括用户的注册、登录和注销。它还提供了一些装饰器和函数,用于保护需要身份验证的视图,只允许已登录的用户访问。 要使用Flask-Login,你需要先安装它,可以通过pip命令进行安装: ``` pip install flask-login ``` 然后,在你的Flask应用中导入并初始化Flask-Login扩展: ```python from flask import Flask from flask_login import LoginManager app = Flask(__name__) login_manager = LoginManager(app) ``` 接下来,你需要定义一个用户模型并实现一些必需的方法,例如获取用户、检查用户密码等。你还需要实现一个用户加载函数,用于从用户ID加载用户对象。这些可以通过继承`UserMixin`类来实现: ```python from flask_login import UserMixin class User(UserMixin): def __init__(self, id): self.id = id def get_id(self): return str(self.id) @login_manager.user_loader def load_user(user_id): return User(user_id) ``` 然后,你可以在视图中使用`@login_required`装饰器来保护需要身份验证的路由: ```python from flask_login import login_required @app.route('/protected') @login_required def protected(): return 'This page requires authentication' ``` 这只是Flask-Login的基本用法,你还可以根据你的需求进行更多的配置和定制。希望这能回答你对Flask-Login的问题!如果你有更多的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值