CBV简版流程
AddPublisher.as_view() ——》 view 函数 当请求来的时候才执行view view中执行: 1. 先实例化AddPublisher,给self
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)
2. 执行self.dispatch() self 有dispatch 就执行自己的 没有就是执行 父类(View)的dispatch方法 3. dispatch中执行: 先通过反射获取到AddPublisher中定义get或者post方法。 执行get或者post方法 返回httpresponse对象 4. view接收到dispatch的返回值——httpresponse对象 5. view返回httpresponse对象
Request对象
当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。
Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。请求相关的常用值
- path_info 返回用户访问url,不包括域名
- method 请求中使用的HTTP方法的字符串表示,全大写表示。
- GET 包含所有HTTP GET参数的类字典对象
- POST 包含所有HTTP POST参数的类字典对象
- body 请求体,byte类型 request.POST的数据就是从body里面提取到的
属性
属性: django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的。0.HttpRequest.scheme 表示请求方案的字符串(通常为http或https)1.HttpRequest.body 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。 但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。 另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。 2.HttpRequest.path 一个字符串,表示请求的路径组件(不含域名)。 例如:"/music/bands/the_beatles/"3.HttpRequest.method 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:"GET"、"POST" 4.HttpRequest.encoding 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。 这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。 接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。 如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。 5.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。 6.HttpRequest.POST 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。 因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST" 另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。 7.HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。 8.HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为 中的name,值则为对应的数据。 注意,FILES 只有在请求的方法为POST 且提交的
上传文件小案例
def upload(request): """ 保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。 但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。 :param request: :return: """ if request.method == "POST": # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值 filename = request.FILES["file"].name # 在项目目录下新建一个文件 with open(filename, "wb") as f: # 从上传的文件对象中一点一点读 for chunk in request.FILES["file"].chunks(): # 写入本地文件 f.write(chunk) return HttpResponse("上传OK")上传文件示例代码
Response对象
与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
HttpResponse类位于django.http模块中。
使用
传递字符串
from django.http import HttpResponseresponse = HttpResponse("Here's the text of the Web page.")response = HttpResponse("Text only, please.", content_type="text/plain")
设置或删除响应头信息
response = HttpResponse()response['Content-Type'] = 'text/html; charset=UTF-8'del response['Content-Type']
属性
HttpResponse.content:响应内容
HttpResponse.charset:响应内容的编码
HttpResponse.status_code:响应的状态码
JsonResponse对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。
from django.http import JsonResponseresponse = JsonResponse({ 'foo': 'bar'})print(response.content)b'{"foo": "bar"}'
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。
response = JsonResponse([1, 2, 3], safe=False)
Django shortcut functions
render参数:request: 用于生成响应的请求对象。template_name:要使用的模板的完整名称,可选的参数context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/html'status:响应的状态码。默认为200。useing: 用于加载模板的模板引擎的名称。
redirect参数可以是:一个模型:将调用模型的get_absolute_url() 函数一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称一个绝对的或相对的URL,将原封不动的作为重定向的位置。默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
HttpResponse 字符串
总结
CBV的简单的流程 1. AddPublisher.as_view()得到一个view函数 url(r'^add_publisher/', view), 2. 请求到来的时候 执行view: 1. 实例化AddPublisher的类,赋值给self 2. 执行dispatch方法 3. 通过反射获取到get或者post的方法 4. 执行get或者post方法,返回HttpResponse对象
装饰器的使用 1. FBV 正常使用 @装饰器 2. CBV from django.utils.decorators import method_decorator 1. 给get或者post方法加 2. 给dispatch方法加 3. 给类加(写name='get')
request request.method 请求方法 GET POST request.GET URL传参 {} request.POST form表单传的参数 request.body 请求体 request.FILES 上传的文件 request.path_info URL路径 不包含域名和URL参数 request.get_full_path() URL路径包含URL参数 request.get_host() 获取IP和端口
response 1. HttpResponse('字符串') —》 页面看到的就是字符串 content—type: text/html;charset=utf8 2. render(request,'HTML文件名',{参数}) ——》返回一个页面 3. redirect('/index/') 跳转 重定向 返回一个响应头 Location:'/index/' 4. JsonResponse(字典) content—type: application/json 返回列表时 safe=False JsonResponse(data,safe=False)