昨日内容回顾
# 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口)01 wsgiref02 uwsgi + nginx03 WSGI协议# 2.Django框架01 中间层02 路由层django1.x:url(\'正则表达式\',\'视图函数的内存地址\')django2.x:path() => 精准匹配re_path => url => 支持正则表达式03 视图层:views.py04 模板层:页面05 模型层:数据06 DB
1. url()2. 无名分组和有名分组:无名分组: 就是把正则表达式用括号括起来,当成位置参数传递给视图函数有名分组: 就是把正则表达式用括号括起来,当成关键字参数传递给视图函数url(\'test/(?P<path>\\d+)\')3. 反向解析通过给路由起一个别名,通过解析别名得到该行锁对应的路由地址4. 无名和有名反向解析
# 当django项目特别大的时候,就会出现许多的路由地址,总路由的压力就会很大django的每一个应用都支持有自己的路由文件,模板文件,static文件...总路由就只负责分发路由,不再做路由地址与视图函数的对应关系eg:from app01 import urls as app01_urlsfrom app02 import urls as app02_urlsfrom app03 import urls as app03_urlsurl(\'app01/\', include(app01_urls))url(\'app02/\', include(app02_urls))http://127.0.0.1:8000/app01/v1/v2/indexurl(\'app01/\', include(\'app01.urls\', namespace=\'app01\'))url(\'app01/\', include(\'app02.urls\',namespace=\'app01\'))reverse(\'app01:index\')reverse(\'app02:index\')
# 1. 创建了一个新的python解释器# 2. 在不同的项目中使用不同的python环境# 3. 不要一直创建虚拟环境
今日内容概要
- JsonResponse类的使用
- form表单上传文件
- CBV和FBV
- CBV的源码分析
- 模板层模板语法之传值
- 模板语法之过滤器
内容详细
1. JsonResponse 类的使用
# 1. 混合开发项目:前端页面和后端代码写到一块# 2. 前后端分离项目:前端是一个项目,后端是一个项目,后端只需要写接口# json格式的数据:进行跨语言数据传输# Python中两个数据传输模块:01 import json\'\'\'支持的数据类型:str,list, tuple, dict, set\'\'\'# 序列化出来的数据是可以看得懂的,就是一个字符串四种方法:dumpsloadsdumpload02 import pickle\'\'\'支持的数据类型:python中的所有数据类型\'\'\'# 序列化出来的结果看不懂,因为结果是一个二进制# pickle序列化出的来的数据只能在python中使用四种方法:dumpsloadsdumpload# js中如何序列化?JSON.stringify() # 序列化JSON.parse() # 反序列化# JsonResponse 类使用演示1.传输字典 但字典内容包含中文在 views.py文件中写入:"""from django.shortcuts import render, HttpResponse, redirect# Create your views here.from django.http import JsonResponsedef index(request):user_dict = {\'username\': \'justin歌手\', \'password\': 123}return JsonResponse(user_dict, json_dumps_params={\'ensure_ascii\': False}) # 如果不包含中文 去掉 json_dumps_params参数即可"""在路由URLS.PY文件中写入:"""from app01 import viewsurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^index/\', views.index),]"""2.传输列表在 views.py文件中写入:"""from django.http import JsonResponsedef index(request):l = [1, 2, 3, 4, 5]return JsonResponse(l, safe=False)"""在URLS.PY文件中保持不变
2. form表单上传文件
# 上传文件注意事项:1. 必须是post请求2. form表单的enctype参数必须为:enctype=\'multipart/form-data\'后端:在request.FILES中接收文件数据,其他数据一律按照请求方式接收# 补充知识:"""数据格式有哪些:1. urlencoded2. form-data3. json格式form表单可以传递的数据格式:1. urlencoded2. form-data# 不能提交json格式的数据提交json格式的数据:1. ajax2. 第三方工具postmanapizza"""# 在urls.py文件中添加路由:url(r\'^upload/\', views.upload),# 在views.py文件中添加功能:"""def upload(request):# POST是拿不到文件数据的print(request.POST)print(request.FILES)if request.method == \'POST\':print(request.FILES)file_obj = request.FILES.get(\'myfile\')print(file_obj.name) # 文件名import uuid# 避免文件名重复导致数据被覆盖aa = str(uuid.uuid4()) + \'.png\'with open(aa, \'wb\') as f:for line in file_obj:f.write(line)return render(request, \'upload.html\')"""# 新建HTML文件 upload.hyml:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><form action="" method="post" enctype="multipart/form-data"><p>username: <input type="text" name="username"></p><p>file: <input type="file" name="myfile"></p><p><input type="submit" value="提交"></p></form></body></html>
3. CBV 和 FBV
# FBV: function based view# CBV# 在views.py文件中添加:"""# 必须继承一个类from django.views import Viewclass IndexView(View):def get(self, request):print(\'get\')return HttpResponse(\'get\')def post(self, request):print(\'post\')return HttpResponse(\'post\')"""# 在urls.py文件中添加路由:url(r\'^indexCbv/\', views.IndexView.as_view()),
4. CBV的源码
如何通过请求方式确定的方法?#############入口################################def view(request, *args, **kwargs):self = cls(**initkwargs) # self = IndexView(**initkwargs)# self => IndexViewreturn self.dispatch(request, *args, **kwargs)##############核心方法################################def dispatch(self, request, *args, **kwargs):# GET POST => get postif request.method.lower() in self.http_method_names:# 反射:get set has delhandler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs) # get(request, *args, **kwargs)
5. 模板语法之传值
# 传值跟变量相关的都使用双括号 {{}}跟逻辑相关的都使用 {% %}\'\'\'模板文件中取值一律使用点语法 . \'\'\'在模板文件里面的函数,不用加括号,会自动加括号调用, 不能传递参数# 在views.py文件中添加:"""def test(request):# user_dict = {\'a\':1}a = 11b = 1.11c = \'hello world\'d = [1, 2, 3, [\'a\', \'b\', {\'hobby\': [\'football\', \'baseball\']}]]e = {\'username\': \'ly\'}f = Trueg = (1, 2, 3)l = {1, 2, 3, 4}h = open(\'a.txt\', \'w\')def info():print(\'info\')return \'info\'return render(request, \'test.html\', locals())"""# 在urls.py文件中添加路由:url(r\'^test/\', views.test),# 新建test.html文件:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body>{{ a }}{{ b }}{{ c }}{{ d.3.2.hobby.0 }}{{ e }}{{ f }}{{ g }}{{ h }}{{ l }}{{ info }}</body></html>
6. 模板语法之过滤器
# 相当于python里面的内置方法# 语法:{{变量|过滤器:参数}}# 过滤器有很多个,大概有六七十,我们只需要掌握5个左右1. length2. defalut3. date4. filesizeformat5. safe# 过滤器里面最大传两个参数,至少一个参数# 在views.py文件中:"""def test(request):c = \'hello world\'f = Falseimport datetimectime = datetime.datetime.now()gg = 123456789hh = \'<h1>hello<h1>\' # 后端加safe 会渲染成h1标签return render(request, \'test.html\', locals())"""# 在test.html文件中:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body>{{ c|length }}{{ f|default:\'这是默认值\' }}{#{{ f|default:\'这是默认值\' }}#}{{ ctime|date:\'Y-m-d H:i:s\' }}{{ gg|filesizeformat }}{{ hh|safe }}</body></html>