Flask(視圖函數 四)

基於類的視圖,可插拔視圖

從Django學來的

好處:

  1. 類可以繼承

  2. 代碼可以複用

  3. 可以定義多種行爲

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轉換,所以需要顯式的裝飾它

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`

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

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 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風格接口

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

get_data = request.args

表單

form_data = request.form

json

json_data = request.json

file

file_data = request.files

上傳文件的代碼

html

<!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代碼

# -*- encoding: utf-8 -*-
"""
@File    : homework.py
@Time    : 2020/6/16 7:18 上午
@Author  : zhongxin
@Email   : [email protected]
"""
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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章