一个视图函数(类),称之为视图。将视图放置在项目(project)或应用程序(app01) 目录中的名为vie.py文件中。
FBV和FBV
FBV -> 把视图写成一个函数 CBV -> 把视图写成一个类 FBV: def login(request): # 在函数中如何区分GET请求和POST请求 if request.method == "GET": # 这是GET请求 -> 获取一个页面 if request.method == "POST": # POST请求 -> 提交数据
CBV 导入基类 from django.views import View class Login(View): def dispatch(self): 在请求前和请求之后执行 hasattr("get") 等到后面讲cookie和session时候再讲(登录) def get(self, request): # 这是GET请求 def post(self, request): # POST请求
Form表单提交数据,三要素:
1. form标签的属性:action=“提交的URL地址”,method=“POST”, 不写method默认是GET请求
2. form表单里面要包含有一个submit按钮
3. input、select(下拉框)、checkbox(单选框)、radio、textarea必须有name属性
Request对象
属性: django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的。
1.request.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。
例如:"GET"、"POST"
2.request.POST
3.request.GET
4.request.path
一个字符串,表示请求的路径组件(不含域名)。 例如:"/music/bands/the_beatles/"
5.request.FILES
一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为<input type="file" name="" /
enctype="multipart/form-data"> 中的name,值则为对应的数据。
注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会 包含数据。
否则,FILES 将为一个空的类似于字典的对象
Request方法
1.request.get_host()
例如:"127.0.0.1:8000" 注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
2.request.get_full_path()
返回 path,如果可以将加上查询字符串。 例如:"/music/bands/the_beatles/?print=true"
3.request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None))
返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。 如果提供 default 参数,将不会引发异常并返回 default 的值。 可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。
4.request.is_ajax()
如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串‘XMLHttpRequest‘。 大部分现代的 javascript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。 如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 你应该使用 vary_on_headers(‘HTTP_X_REQUESTED_WITH‘) 装饰你的视图以让响应能够正确地缓存。
5.如果POST请求提交过来的数据某一项有多个值:
比如说:多选的select >option (name写在select上)
checkbox (多项时name值一样)
request.POST.getlist("hobby")
request.POST 里面没有文件相关内容
示例:
<select name="num" id="" multiple>
<option value="1">一</option>
<option value="2">二</option>
<option value="3">三</option>
</select>
<input name="num2" type="checkbox" value="66">
<input name="num2" type="checkbox" value="88">
<input name="num2" type="checkbox" value="99">
<input type="submit" value="提交">
Response对象
与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
HttpResponse类位于django.http模块中。
使用
传递字符串
from django.http import HttpResponse response = 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 JsonResponse response = JsonResponse({‘foo‘: ‘bar‘}) print(response.content) b‘{"foo": "bar"}‘
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。
response = JsonResponse([1, 2, 3], safe=False)
Django shortcut functions
render()
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
其默认的Content-Type标头设置为application/json。
参数: request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数 context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。 content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。 status:响应的状态码。默认为200。
一个简单的例子:
from django.shortcuts import render def my_view(request): # 视图的代码写在这里 return render(request, ‘myapp/index.html‘, {‘foo‘: ‘bar‘})
上面的代码等于:
from django.http import HttpResponse from django.template import loader def my_view(request): # 视图代码写在这里 t = loader.get_template(‘myapp/index.html‘) c = {‘foo‘: ‘bar‘} return HttpResponse(t.render(c, request))
redirect()
参数可以是:
- 一个模型:将调用模型的get_absolute_url() 函数
- 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
- 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
你可以用多种方式使用redirect() 函数。
传递一个对象(ORM相关)
将调用get_absolute_url() 方法来获取重定向的URL:
from django.shortcuts import redirect def my_view(request): ... object = MyModel.objects.get(...) return redirect(object)
传递一个视图的名称
def my_view(request): ... return redirect(‘some-view-name‘, foo=‘bar‘)
传递要重定向到的一个具体的网址
def my_view(request): ... return redirect(‘/some/url/‘)
当然也可以是一个完整的网址
def my_view(request): ... return redirect(‘http://example.com/‘)
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
def my_view(request): ... object = MyModel.objects.get(...) return redirect(object, permanent=True)