views 其实没什么可看的, 在 django 中 views 就是 controller, 是处理请求的, 就是一个普通的 python 方法。
一般从 request 中提取请求参数, 然后处理业务逻辑, 跟数据库和后台服务做交互,取回数据,渲染模板,将返回结果包装进 HttpResponse 然后返回。
def view_index(request): return HttpResponse(content='hello world') def view_index(request): name = request.GET.get('name', '') age = request.POST.get('age', 0) return render(request, 'blogs/index.html', {'name': 'leslie', 'age': 27}) def view_comments(request): return JsonResponse(data={'hello': 'world'})
怎么处理 cookie, 得到用户 UA 等等直接参考源码就行了。
Class-based views
为什么会有 Class-based views 首先 在 function views 中必须用 if else 来分别处理 get 和 post 请求,
而在 class 中你可以用 2 个 method 分别处理 get 和 post
以前是这样的
def my_view(request): if request.method == 'GET': # <view logic> return HttpResponse('result')
而且 Class-based views 可以充分利用面向对象和继承 mixins 等特殊,更加灵活, 代码复用度更高。
现在是这样的
urlpatterns = [ url(r'^index/$', Index.as_view()) ] class Index(View): http_method_names = ['get', 'post'] def get(self, request, *args, **kwargs): return HttpResponse('hello class based view') def post(self, request, *args, **kwargs): pass
而且 django 内置了很多好用的 generic class-based views 和 mixin classes,只需简单继承或 mixin 进来就可灵活定制,非常方便
urlpatterns = [ url(r'^about/', TemplateView.as_view(template_name="about.html")), ]
as_view 其实是一个 classmethod ,定义在 View 类中, as_view 中会调用 dispatch 方法, dispatch 其实最后调用的还是 get 或 post 方法
最后调用的还是一个 function, 跟 function view 没有什么区别。 具体实现参考源码。
class-based views 更加灵活, 应该尽量多使用。