day4django请求和响应、视图
django中的请求和响应
django框架是一个web应用框架,本质上就是处理用户发起的请求,然后返回响应结果,请求、和响应就是框架中的数据流
当一个请求来时,django会把它创建成一个HttpRequest对象,该对象包含了请求的元数据。然后django加载适当的视图,将HttpRequest对象作为一个参数传递给视图函数。每个视图函数负责返回一个HttpResponse对象
常用属性(HttpReques=request)
HttpRequest.body
原始请求的body,格式是字节类型
HttpRequest.method
代表当前请求中使用的http方法的字符串,保证是大写字母
HttpRequest.POST
- 接受表单提交的数据
- 表单数据可以直接通过POST属性获取
- 一个类字典对象,包含所有给定的表单格式的POST请求参数
HttpRequest.GET
一个类字典对象,包含给定http的url参数,查询参数,?key=value
HttpRequest.FILES
一个类字典,包含所有的上传文件
HttpRequest.headers
请求头信息
请求参数类型
1、查询字符串参数
url中,?后面以key=value形式的参数
django中使用,request.GET获取
2、请求体参数
- form表单
django中使用,request.POST获取,注意POST属性只有post请求并且是form表单格式才能获取
对于post以外的请求,form表单也是通过request.body属性获取
- json
django使用,request.body属性获取
- 文件
django中使用,request.files属性获取
3、路径参数
url路径中
django中通过路由规则传递给视图参数
响应
用法
传入字符串
from django.http import HttpResponse
response1 = HttpResponse("我是一个字符串")
response1 = HttpResponse(“Text”,content_type="text/plain")
response2 = HttpResponse(b"Texr")
增量方式
response = HttpResponse()
response.write("<p>我是一个响应对象</p>")
response.write("<p>我是第二行</p>")
设置响应头字段
1、在实例化的时候以参数的形式传入
2、在对象的headers属性里设置
response = HttpResponse("我是一个字符串")
response.headers["content_type"] = "text/plain"
django内置的响应类型
django包含了许多HttpResponse的字类用来处理不同的响应类型
JsonResponse对象
from django.http import JsonResponse
一个HttpResponse的字类,创建一个json编码的响。默认的Content-type设置为application/json
JsonResponse(data, encoder=DjangoJSONEncoder, safe=True)
第一个参数默认data只能是字典,如果不是字段需要参数safe = False
注意:data里面包含的数据,只能是字符串、数值、datetime、Decimal、True、False、None它们组成的字典或者列表
常用的用法:
response = JsonResponse({"foo":"bar"})
序列化非字典对象
response = JsonResponse([1,2,3],safe = False)
视图
django中视图本质上就是函数,接受用户传入的请求,返回对应的响应
在视图中处理业务逻辑,django约定将视图放在view.py的文件中,这个文件应放在项目或者应用目录中
函数视图
def some_view(self): dosometing return HttpResponse(html)
特点:
逻辑清晰好理解
复用性较差
函数视图的路由
urlpatterns = [ path("create/", views.create_project) # create_project就是函数 ]
类视图
基于类的视图,换了一种写法
优势:
- 用特定的方法去管理http方法(get,post)
- 使用面向对象的技术,可以将代码分解成可重用的组件
使用类视图
所有的类视图都要继承django.views.View
定义get方法,对应http协议中的get请求
class ProjectView(View): def get(self, request): return render(request, "projects/create.html") def post(self,request): name = request.POST.get("name") files = request.FILES.get("aaa") file_name = r"E:\CK10" + "\\" + files.name with open(file_name, "wb") as f: for line in files: f.write(line) return HttpResponse("项目:{}创建成功".format(name))
类视图的路由
urlpatterns = [ path("create/", views.ProjectView.as_view()) ]
注意:as_view()会返回一个函数, 不要忘记括号()