каталог
Метод 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 определяют, разрешить ли способ запроса и запроса выполнения
Второй подход помог нам хорошее распределение пакетов художественных запросов, более рекомендуется использовать