目录
该方法返回客户端用于发起请求的HTTP方法,例如可以是'GET','POST','PUT','DELETE'等,可以使用该方法来确定请求的类型,并相应的执行特定操作
该属性是一个类似字典的对象,包含了请求中通过POST方法发送的所有参数,这些参数通常是通过HTML表单发送的,可以使用参数的名字作为键来访问单个参数
类似于request.POST,该属性包含了请求中通过GET方法发送的所有参数,这些参数通常会附加在URL之后,以问号分隔,可以使用参数的名字作为键来访问单个参数
该属性是一个类似字典的对象,包含了请求中通过文件上传组件发送的所有文件,当表单中包含文件上传字段时,通过request.FILES可以访问上传的文件,可以使用文件的名字作为键来访问单个文件
只能获取到路由地址,无法获取到参数
视图函数既可以是函数也可以是类
- def index(request):
- return HttpResponse('index')
- # CBV路由 根据请求方式的不同选择不同的入口动作
- url('^login/',views.MyLogin.as_view())
- from django.views import View
-
-
-
- class MyLogin(View):
- def get(self,request,*args,**kwargs):
- return HttpResponse("get")
-
-
-
- def post(self,request,*args,**kwargs):
- return HttpResponse("post")
FBV(Function-Based Views)与 CBV(Class-Based Views)是 Django 框架中用于处理视图(Views)的两种不同的编程方式。
- from django.http import HttpResponse
-
- def my_view(request):
- # 处理逻辑
- if request.method == 'GET':
- # 处理 GET 请求
- return HttpResponse('Hello, GET Request!')
- elif request.method == 'POST':
- # 处理 POST 请求
- return HttpResponse('Hello, POST Request!')
- from django.http import HttpResponse
- from django.views import View
-
- class MyView(View):
- def get(self, request):
- # 处理 GET 请求
- return HttpResponse('Hello, GET Request!')
-
- def post(self, request):
- # 处理 POST 请求
- return HttpResponse('Hello, POST Request!')
url(r'^login/', views.MyLogin.as_view()),
方法/函数名 加 括号 执行优先级最高
- @classonlymethod
- def as_view(cls, **initkwargs):
- """
- Main entry point for a request-response process.
- """
- for key in initkwargs:
- if key in cls.http_method_names:
- raise TypeError("You tried to pass in the %s method name as a "
- "keyword argument to %s(). Don't do that."
- % (key, cls.__name__))
- if not hasattr(cls, key):
- raise TypeError("%s() received an invalid keyword %r. as_view "
- "only accepts arguments that are already "
- "attributes of the class." % (cls.__name__, key))
-
- def view(request, *args, **kwargs):
- self = cls(**initkwargs)
- if hasattr(self, 'get') and not hasattr(self, 'head'):
- self.head = self.get
- self.request = request
- self.args = args
- self.kwargs = kwargs
- return self.dispatch(request, *args, **kwargs)
- view.view_class = cls
- view.view_initkwargs = initkwargs
-
- # take name and docstring from class
- update_wrapper(view, cls, updated=())
-
- # and possible attributes set by decorators
- # like csrf_exempt from dispatch
- update_wrapper(view, cls.dispatch, assigned=())
- return view
url(r'^login/',views.view()),
总结:CBV和FBV在路由匹配本质上是一样的,都是路由对应函数内存地址
- def view(request, *args, **kwargs):
- # 参数 cls 就是我们自己写的类
- self = cls(**initkwargs)
- # 等价于 self = MyLogin(**initkwargs) ---- 产生一个我们自己写的类的对象
- if hasattr(self, 'get') and not hasattr(self, 'head'):
- self.head = self.get
- # 给我们的对象赋值属性
- self.request = request
- self.args = args
- self.kwargs = kwargs
- '''
- 在看python源码的时候,一定要时刻注意面向对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里面找
- 之后再去父类找
- 总结:在看源码时,如果遇到 self.x 操作时,一定要时刻注意当前这个self到底是谁
- '''
- return self.dispatch(request, *args, **kwargs)
- http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
-
- # CBV 的 精髓 !!!
- def dispatch(self, request, *args, **kwargs):
- # Try to dispatch to the right method; if a method doesn't exist,
- # defer to the error handler. Also defer to the error handler if the
- # request method isn't on the approved list.
- # 获取当前请求的小写格式 然后比对当前请求方式是否合法
- # 以 get 请求为例
- if request.method.lower() in self.http_method_names:
- '''
- 反射:通过字符串来操作对象的属性或方法
- '''
- # self 是我们自己写的类产生的对象
- # handler = getattr(自己写的类产生的对象,'get',当找不到get属性或方法时就会用到第三个参数)
- # 因为我们在自己的类里面重写了 get 方法 ,所以这里的 handler 就变成了我们自己写的 get方法
- # handler = 我们自己写的类里面的get方法
- handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
- else:
- handler = self.http_method_not_allowed
-
- # 自动调用 get 方法
- return handler(request, *args, **kwargs)
url(r'^login/', views.MyLogin.as_view()),