Колба Quick Start (4) - ОЦК написание и анализ

Метод 1: Просмотр наследования

from flask import Flask, views
app = Flask(__name__)

class IndexView(views.View):
    methods = ['GET']

    def dispatch_request(self):
        print('index')
        return 'Index!'

app.add_url_rule('/index', view_func=IndexView.as_view(name='name'))
if __name__ == '__main__':
    app.run()

Как Джанго, когда колба в ОЦК модели требуется

1: вид из классов пользовательских функций, наследования flask.view.View

2: Выполнение as_view () метод, за исключением того, где as_view должен иметь имя параметра. Почему здесь есть имя еще?

3: dispatch_request метод определенная функция в классе зрения, почему надо писать так, чтобы это сделать.

Посмотрите на исходный код, как выполнять, так, чтобы ответить на сомнения. Первым выполняется методом as_view вид класса. Первый взгляд на пользовательский класс, то смотреть не родитель, что View.as_view ()

as_view () анализ исходного кода

@classmethod  # 是一个类方法,此时cls表示自定义的类IndexView
def as_view(cls, name, *class_args, **class_kwargs):  # 第一个位置参数没有默认值,所以必须要传
    def view(*args, **kwargs):   # 请求来了执行
        self = view.view_class(*class_args, **class_kwargs)  # cls()实例化一个对象
        return self.dispatch_request(*args, **kwargs)  # 执行dispath_request()方法,如果在自定义类中没有定义该方法,则执行父类的dispatch_request(),点进去其实就是raise NotImplementedError()
    
    if cls.decorators:
        view.__name__ = name
        view.__module__ = cls.__module__
        for decorator in cls.decorators:
            """在这里对decorators循环遍历,然后再将view函数传入执行。其实就是装饰器"""
            view = decorator(view)

    view.view_class = cls
    view.__name__ = name  # 给view函数重命名,这样在该方法 return view时返回的是不同的函数名,遵循路由与视图函数一一对应的元则
    view.__doc__ = cls.__doc__
    view.__module__ = cls.__module__
    view.methods = cls.methods
    view.provide_automatic_options = cls.provide_automatic_options
    return view  # 返回的是一个函数名,这样当请求来的时候执行的就是view()函数 

Краткое описание:

(1) пользовательский класс вида наследование flask.views.View, который должен быть переписан методом dispatch_request (). В этом методе запрос распределения варианты осуществления выполняет соответствующую функцию

(2) в as_view () должен передать имя параметра. Которая эквивалентна конечная точка играет псевдоним для обратного маршрута поиска. Там конечной точки обратный анализ по конечной точке, а не по значению имени

(3) Различные маршруты не могут играть один и тот же псевдоним. Если следовать и элемент маршрута является функцией одного вида, например, это не приемлемо

app.add_url_rule('/index', view_func=IndexView.as_view(name='name'))
app.add_url_rule('/login', view_func=IndexView.as_view(name='name'))

Второй способ: наследование MethodView

from flask import Flask,views

app = Flask(__name__)
class IndexView(views.MethodView):
    methods = ['GET','POST']
    def get(self):
        return 'index get method'

    def post(self):
        return 'index post method'

app.add_url_rule('/index',view_func=IndexView.as_view(name='hello'))
if __name__ == '__main__':
    app.run()

При осмотре методы анализа, метод должен быть определен видом dispatch_request класса наследование Пользовательский вид, соответствующая функция достигается в этом методе определяется способом запроса. В классе MethodView помог нам достичь dispatch_request. Давайте посмотрим на источник MethodView:

class MethodView(with_metaclass(MethodViewType, View)):
    
    def dispatch_request(self, *args, **kwargs):
        # self是自定义的视图类,判断来的请求方式请否允许并获取
        meth = getattr(self, request.method.lower(), None)
        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)  # 比如请求方式为get,到这里就是执行get()

(1) выполняет метод as_view (). На самом деле, вызов все еще находится в View as_view выше, был введен запрос поступил на реализацию метода dispatch_request

(2) метод не dispatch_request пользовательский класс, выполнить метод MethodView в dispatch_request

(3) dispatch_request определяют, разрешить ли способ запроса и запроса выполнения

Второй подход помог нам хорошее распределение пакетов художественных запросов, более рекомендуется использовать

рекомендация

отwww.cnblogs.com/863652104kai/p/11604557.html