视图相应函数
视图函数接收HTTP请求并相应,可以放在任何地方,可以是任何功能。
- 视图函数可以返回web文本、重定向、页面、请求、图片等任何内容。
- 视图函数通过HttpResponse、JsonResponse等类表达并返回响应。
- 视图函数一般放在对应app中的
views.py
中。
Django的相应类型:
-
- HttpResponse类及子类
-
- JsonResponse类
-
- StreamingHttpResponse类
-
- FileResponse类
-
- Render类
一、 HttpResponse 响应函数
1.1. HttpResponse响应一览表
编码 | 定义 | 描述 |
---|---|---|
200 | HttpResponse | 常规响应,表示正常 |
301 | HttpResponsePermanentRedirect | 永久重定向 |
302 | HttpResponseRedirect | 访问重定向 |
304 | HttpResponseNotModified | 网页未发生变化 |
400 | HttpResponseBadRequest | 不良响应 |
403 | HttpResponseForbidden | 禁止访问 |
404 | HttpResponseNotFound | 网页丢失 |
405 | HttpResponseNotAllowed | 响应不被允许 |
410 | HttpResponseGone | 网页丢失 |
500 | HttpResponseServerError | 服务器错误 |
1.2. HttpResponse响应格式
HttpResponse(content, content_type=None,\
status=200, charset=None)
其中
content
:拟返回的字符串content_type
:MIME格式的返回内容类型status
:响应的状态码char_set
:响应的字符集
1.3. HttpResponse 示例
# 在框架的url中增加HttpResponse函数对应的路径
# 这个是yourhtml下的urls
from yourapp import views as yourappviews
urlpatterns = [
path('', yourappviews.func)
]
# 在yourapp中的views增加对应的func
from django.http import HttpResponse
def func(request):
response = HttpResponse()
response.write('do something now.') # 这里会生成一个新的网页。
二、JsonResponse 响应
2.1. JsonResponse结构
JsonResponse(data)
:主要用于数据类型的相应,其中:
data是{key:value}
的字典键值对,返回Json的数据格式。
2.2 JsonResponse示例
from django.http import JsonResponse
def func(request):
Response= JsonResponse({
'key':'value'})
return response
下面展示Django下载文件最优的两种方法
三、StreamingHttpResponse 响应
3.1 StreamingHttpResponse结构
StreamingHttpResponse(streaming_content)
:流式相应,内容的迭代器形式,以内容流的方式响应。
注:
StreamingHttpResponse
一般多现实在页面上,不提供下载。
以下为示例代码
def streamDownload(resquest):
def file_iterator(filepath, chunk_size = 512):
with open(filepath, 'rb') as f:
while True:
con = f.read(512)
if con:
yield con
else:
break
filename = os.path.abspath(__file__) + 'test.txt'
response = StreamingHttpResponse(file_iterator(filename)
return response
# 最后程序会将结果打印在显示器上
四、FileResponse响应
4.1 FileResponse结构
FileResponse(stream)
:以流形式打开后的文件
FileResponse
是StreamingHttpResponse
的子类
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/youfile", "rb"))
response['Content-Type] = 'application/octet-stream'
response['COntent-Disposition'] = 'attachment;filename="filename"'
return response
需要解释说明的是:
response['Content-Type] = 'application/octet-stream'
response['COntent-Disposition'] = 'attachment;filename="filename"'
Content-Type
:用于指定文件类型。
COntent-Disposition
:用于指定下载文件的默认名称,对,没错! “CO”两个字符都要大写。
两者都是MIME协议里面的标准类型。
五、Render 响应函数
开发一个网页,如何“跨”多级MVC的类,如何变静态网页为***页,如何将自己的上下文组合成内容再返回到网页前端?
——此时就需要render()
函数了。
5.1 render函数结构
render(request, template_name, context=None, content_type=None, status=None, using=None)
必选参数
request
:用于生成相应的请求对象。template_name
:要使用的模板的全名或者模板的序列。如果给定了一个列表,则选择存在的第一个模板。可选参数
context
:表示要添加到模板上下文的值的字典。默认情况下,是一个空的字典,如果字典是可调用的,则视图将在渲染模板前调用它。content_type
:用于结果文档MIME类型默认为:setting配置文件:DEFAULT_CONTENT_TYPE
的值。status
:默认相应为200。using
:用于加载模块的模块引擎:setting配置文件:NAME
5.2 render函数示例
from django.shortcuts import render
def my_view(request):
return render(request, 'my_app\index.html', {
'foo':'bar'}, content_type='application\xhtml+xml)
↓↓↓相当于以下内容↓↓↓
from django.http import HttpResponse
from django.template import loader
def my_view(request):
t = loader.get_template("my_app\index.html")
c = {
"foo":"bar"}
return HttpResponse(t.render(request, c), content_type='application\xhtml+xml')