三板斧的使用
HttpResponse: 字符串
render: 渲染html页面
redirect: 重定向的# 在视图文件中写视图函数的时候不能没有返回值了,默认返回的是None,页面上就会报错
def render(request, template_name, context=None, content_type=None, status=None, using=None): content = loader.render_to_string(template_name, context, request, using=using) return HttpResponse(content, content_type, status)
JsonReponse序列化类的使用
# json有什么用:跨语言传输
序列化: json.dumps 反序列化: json.loads
# 向前端返回一个json格式字符串的两种方式
方式一:
import json def my_view(request): data=['egon','kevin'] return HttpResponse(json.dumps(data) )
方式二:
from django.http import JsonResponse def my_view(request): data=['egon','kevin'] return JsonResponse(data,safe=False) #默认safe=True代表只能序列化字典对象,safe=False代表可以序列化字典以外的对象
form表单上传文件
<form action="" method="post">
表单上传数据需要满足的条件:
1. 请求方式必须是post
2. enctype="multipart/form-data"
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit"> </form> </body> </html>
3、request对象方法:
request.method
request.POST.get()
request.POST.getlist()
request.GET.get()
request.GET.getlist()
request.FILES
request.path
request.path_info # 不能接收参数,接收的是后缀
request.get_full_path() # 也能够接收参数
print(request.POST) # 接收的都是普通的数据,非文件数据 print(request.FILES) # 只接受文件数据,普通数据还在request.POST里面 def index(request): # user_dict = {'username':'kevin你好'} user_dict = [1, 2, 3, 4] print(request.POST) # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 234.png (image/png)>]}> file_obj=request.FILES.get('myfile') # print(request.body) # 接收纯原生的二进制数据,没有任何的处理 b''----> str---->decode---->dict... # print(request.POST.get('')) # 之所以你能够直接按照字典的方式取值,是因为django给做了封装 print(request.path) # /index/ /index/ print(request.path_info) # /index/ /index/ print(request.get_full_path()) # /index/ /index/?a=1&b=2 print(request.GET.get('')) return render(request,'index.html')
CBV的写法
# 视图是可调用的,用来处理请求(request)并且返回响应(response),django的视图有两种形式:FBV和CBV
# FBV: function based view # 写的都是函数
FBV中视图函数处理HTTP的GET请求如下:
from django.http import HttpResponse def my_view(request): if request.method == 'GET': # <view logic> return HttpResponse('GET result') elif request.method == 'POST': # <view logic> return HttpResponse('POST result')
# CBV: class based view # 写的都是类
CBV的实现如下:
from django.http import HttpResponse from django.views import View class Login(View): def get(self, request): # <view logic> return HttpResponse('GET result') def post(self, request): # <view logic> return HttpResponse('POST result')
CBV的源码分析
# 入口 url(r'^login/', views.MyLogin.as_view()), # View类中得as_view方法的返回值是view函数名 # 当请求来的时候,会触发view函数的执行 def view(request, *args, **kwargs): # cls:Mylogin()------>self对象 self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs) # View类里的dispatch def dispatch(self, request, *args, **kwargs): if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) from django.views import View class MyLogin(View): http_method_names = ['get', 'post'] def get(self, request): print('get。。。') self.index() return HttpResponse("get") def post(self, request): return HttpResponse("hello postman!!!") def index(self): pass
权限、频率、jwt的源码
模板层之模板变量
# PHP:不是后端语言,前端 操作数据量,写逻辑,都可以
在html页面中写一个python的代码
# 在模板中取值的时候,使用的是点语法(.)# 在模板中得函数调用的时候不要加括号,自动加括号,只需写函数名
{{ 写变量 }}
{% 写逻辑 %}{{ d.0 }} {{ d.1 }} {{ d.3 }} {{ user_dict.hobby.2 }} {{ index }} {{ obj.score }}