前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask(视图函数 四)

Flask(视图函数 四)

作者头像
zx钟
发布2020-06-19 11:03:59
4790
发布2020-06-19 11:03:59
举报
文章被收录于专栏:测试游记

基于类的视图,可插拔视图

从Django学来的

好处:

  1. 类可以继承
  2. 代码可以复用
  3. 可以定义多种行为
代码语言:javascript
复制
from flask import Flask, request
from flask.views import View

app = Flask(__name__)


class UserView(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
        return dispatch_pattern.get(method)()


app.add_url_rule(
    '/user',
    view_func=UserView.as_view('user'),
    methods=["GET", "POST"]
)

if __name__ == '__main__':
    app.run(debug=True)

GET

装饰这个类视图

由于会被as_view转换,所以需要显式的装饰它

代码语言:javascript
复制
def log_time(f):
    def decorator(*args, **kwargs):
        print(time.time())
        return f(*args, **kwargs)

    return decorator


f = UserView.as_view('user')
log_time(f)

app.add_url_rule(
    '/user',
    view_func=f,
    methods=["GET", "POST"]
)

使用`MethodView`

代码语言:javascript
复制
from flask import Flask, request
from flask.views import View, MethodView

app = Flask(__name__)


class ProjectView(MethodView):
    def get(self):
        return 'get'

    def post(self):
        return 'post'


app.add_url_rule(
    '/project',
    view_func=ProjectView.as_view('project'),
    methods=["GET", "POST"]
)

if __name__ == '__main__':
    app.run(debug=True)

这个类就是继承了View然后重写了dispatch_request

代码语言:javascript
复制
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)

相当于

代码语言:javascript
复制
class MethodView:
    def get(self):
        print('get')    
        return 'get'

    def post(self):
        print('post')
        return 'post'

    def dispatch_request(self):
        func = getattr(self, 'get', None)
        return func()


MethodView().dispatch_request()

func = getattr(self, 'get', None)

使用MethodView实现reful风格接口

代码语言:javascript
复制
from flask.views import MethodView
from flask import Flask

app = Flask(__name__)


class ProjectView(MethodView):
    def get(self, project_id):
        if project_id is None:
            return 'ALL projects'
        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 = ProjectView.as_view('projects')
app.add_url_rule('/projects/<project_id>', view_func=f, methods=['GET', 'POST', 'PUT', 'DELETE'])
app.add_url_rule('/projects/', defaults={"project_id": None}, view_func=f, methods=['GET'])
if __name__ == '__main__':
    app.run()

request获取请求数据

get

代码语言:javascript
复制
get_data = request.args

表单

代码语言:javascript
复制
form_data = request.form

json

代码语言:javascript
复制
json_data = request.json

file

代码语言:javascript
复制
file_data = request.files

上传文件的代码

html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
    <input type="file" name="pic">
    <input type="submit">
</form>
</body>
</html>

python代码

代码语言:javascript
复制
# -*- encoding: utf-8 -*-
"""
@File    : homework.py
@Time    : 2020/6/16 7:18 上午
@Author  : zhongxin
@Email   : 490336534@qq.com
"""
import os
import time

from flask import Flask, request, render_template, redirect

app = Flask(__name__)
print(app.instance_path)
print(app.root_path)
print(app.static_folder)


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/uploads', methods=['POST'])
def upload():
    file = request.files.get('pic')
    if not file:
        return render_template('index.html')
    file_name = time.strftime('%Y-%m-%d-%H-%M-%S') + file.filename
    file_url = f'/static/{file_name}'
    file.save(os.path.join(
        app.root_path,
        app.static_folder,
        file_name
    ))
    return redirect(file_url)


if __name__ == '__main__':
    app.run()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于类的视图,可插拔视图
  • 装饰这个类视图
  • 使用`MethodView`
  • 使用MethodView实现reful风格接口
  • request获取请求数据
    • get
      • 表单
        • json
          • file
          • 上传文件的代码
            • html
              • python代码
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档