昨日内容回顾

  • Django请求生命周期
  1. # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口)
  2. 01 wsgiref
  3. 02 uwsgi + nginx
  4. 03 WSGI协议
  5. # 2.Django框架
  6. 01 中间层
  7. 02 路由层
  8. django1.x:url('正则表达式''视图函数的内存地址')
  9. django2.x:
  10. path() => 精准匹配
  11. re_path => url => 支持正则表达式
  12. 03 视图层:views.py
  13. 04 模板层:页面
  14. 05 模型层:数据
  15. 06 DB
  • 路由层
  1. 1. url()
  2. 2. 无名分组和有名分组:
  3. 无名分组: 就是把正则表达式用括号括起来,当成位置参数传递给视图函数
  4. 有名分组: 就是把正则表达式用括号括起来,当成关键字参数传递给视图函数
  5. url('test/(?P<path>\d+)')
  6. 3. 反向解析
  7. 通过给路由起一个别名,通过解析别名得到该行锁对应的路由地址
  8. 4. 无名和有名反向解析
  • 路由分发
  1. # 当django项目特别大的时候,就会出现许多的路由地址,总路由的压力就会很大
  2. django的每一个应用都支持有自己的路由文件,模板文件,static文件...
  3. 总路由就只负责分发路由,不再做路由地址与视图函数的对应关系
  4. eg:
  5. from app01 import urls as app01_urls
  6. from app02 import urls as app02_urls
  7. from app03 import urls as app03_urls
  8. url('app01/', include(app01_urls))
  9. url('app02/', include(app02_urls))
  10. http://127.0.0.1:8000/app01/v1/v2/index
  11. url('app01/', include('app01.urls', namespace='app01'))
  12. url('app01/', include('app02.urls',namespace='app01'))
  13. reverse('app01:index')
  14. reverse('app02:index')
  • 虚拟环境
  1. # 1. 创建了一个新的python解释器
  2. # 2. 在不同的项目中使用不同的python环境
  3. # 3. 不要一直创建虚拟环境

今日内容概要

  • JsonResponse类的使用
  • form表单上传文件
  • CBV和FBV
  • CBV的源码分析
  • 模板层
    • 模板语法之传值
    • 模板语法之过滤器

内容详细

1. JsonResponse 类的使用

  1. # 1. 混合开发项目:前端页面和后端代码写到一块
  2. # 2. 前后端分离项目:前端是一个项目,后端是一个项目,后端只需要写接口
  3. # json格式的数据:进行跨语言数据传输
  4. # Python中两个数据传输模块:
  5. 01 import json
  6. '''支持的数据类型:str,list, tuple, dict, set'''
  7. # 序列化出来的数据是可以看得懂的,就是一个字符串
  8. 四种方法:
  9. dumps
  10. loads
  11. dump
  12. load
  13. 02 import pickle
  14. '''支持的数据类型:python中的所有数据类型'''
  15. # 序列化出来的结果看不懂,因为结果是一个二进制
  16. # pickle序列化出的来的数据只能在python中使用
  17. 四种方法:
  18. dumps
  19. loads
  20. dump
  21. load
  22. # js中如何序列化?
  23. JSON.stringify() # 序列化
  24. JSON.parse() # 反序列化
  25. # JsonResponse 类使用演示
  26. 1.传输字典 但字典内容包含中文
  27. views.py文件中写入:
  28. """
  29. from django.shortcuts import render, HttpResponse, redirect
  30. # Create your views here.
  31. from django.http import JsonResponse
  32. def index(request):
  33. user_dict = {'username': 'justin歌手', 'password': 123}
  34. return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False}) # 如果不包含中文 去掉 json_dumps_params参数即可
  35. """
  36. 在路由URLS.PY文件中写入:
  37. """
  38. from app01 import views
  39. urlpatterns = [
  40. url(r'^admin/', admin.site.urls),
  41. url(r'^index/', views.index),
  42. ]
  43. """
  44. 2.传输列表
  45. views.py文件中写入:
  46. """
  47. from django.http import JsonResponse
  48. def index(request):
  49. l = [1, 2, 3, 4, 5]
  50. return JsonResponse(l, safe=False)
  51. """
  52. URLS.PY文件中保持不变

2. form表单上传文件

  1. # 上传文件注意事项:
  2. 1. 必须是post请求
  3. 2. form表单的enctype参数必须为:
  4. enctype='multipart/form-data'
  5. 后端:
  6. request.FILES中接收文件数据,其他数据一律按照请求方式接收
  7. # 补充知识:
  8. """
  9. 数据格式有哪些:
  10. 1. urlencoded
  11. 2. form-data
  12. 3. json格式
  13. form表单可以传递的数据格式:
  14. 1. urlencoded
  15. 2. form-data
  16. # 不能提交json格式的数据
  17. 提交json格式的数据:
  18. 1. ajax
  19. 2. 第三方工具
  20. postman
  21. apizza
  22. """
  23. # 在urls.py文件中添加路由:
  24. url(r'^upload/', views.upload),
  25. # 在views.py文件中添加功能:
  26. """
  27. def upload(request):
  28. # POST是拿不到文件数据的
  29. print(request.POST)
  30. print(request.FILES)
  31. if request.method == 'POST':
  32. print(request.FILES)
  33. file_obj = request.FILES.get('myfile')
  34. print(file_obj.name) # 文件名
  35. import uuid
  36. # 避免文件名重复导致数据被覆盖
  37. aa = str(uuid.uuid4()) + '.png'
  38. with open(aa, 'wb') as f:
  39. for line in file_obj:
  40. f.write(line)
  41. return render(request, 'upload.html')
  42. """
  43. # 新建HTML文件 upload.hyml:
  44. <!DOCTYPE html>
  45. <html lang="en">
  46. <head>
  47. <meta charset="UTF-8">
  48. <title>Title</title>
  49. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  50. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  51. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  52. </head>
  53. <body>
  54. <form action="" method="post" enctype="multipart/form-data">
  55. <p>username: <input type="text" name="username"></p>
  56. <p>file: <input type="file" name="myfile"></p>
  57. <p>
  58. <input type="submit" value="提交">
  59. </p>
  60. </form>
  61. </body>
  62. </html>

3. CBV 和 FBV

  1. # FBV: function based view
  2. # CBV
  3. # 在views.py文件中添加:
  4. """
  5. # 必须继承一个类
  6. from django.views import View
  7. class IndexView(View):
  8. def get(self, request):
  9. print('get')
  10. return HttpResponse('get')
  11. def post(self, request):
  12. print('post')
  13. return HttpResponse('post')
  14. """
  15. # 在urls.py文件中添加路由:
  16. url(r'^indexCbv/', views.IndexView.as_view()),

4. CBV的源码

  1. 如何通过请求方式确定的方法?
  2. #############入口################################
  3. def view(request, *args, **kwargs):
  4. self = cls(**initkwargs) # self = IndexView(**initkwargs)
  5. # self => IndexView
  6. return self.dispatch(request, *args, **kwargs)
  7. ##############核心方法################################
  8. def dispatch(self, request, *args, **kwargs):
  9. # GET POST => get post
  10. if request.method.lower() in self.http_method_names:
  11. # 反射:get set has del
  12. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  13. else:
  14. handler = self.http_method_not_allowed
  15. return handler(request, *args, **kwargs) # get(request, *args, **kwargs)

5. 模板语法之传值

  1. # 传值
  2. 跟变量相关的都使用双括号 {{}}
  3. 跟逻辑相关的都使用 {% %}
  4. '''模板文件中取值一律使用点语法 . '''
  5. 在模板文件里面的函数,不用加括号,会自动加括号调用, 不能传递参数
  6. # 在views.py文件中添加:
  7. """
  8. def test(request):
  9. # user_dict = {'a':1}
  10. a = 11
  11. b = 1.11
  12. c = 'hello world'
  13. d = [1, 2, 3, ['a', 'b', {'hobby': ['football', 'baseball']}]]
  14. e = {'username': 'ly'}
  15. f = True
  16. g = (1, 2, 3)
  17. l = {1, 2, 3, 4}
  18. h = open('a.txt', 'w')
  19. def info():
  20. print('info')
  21. return 'info'
  22. return render(request, 'test.html', locals())
  23. """
  24. # 在urls.py文件中添加路由:
  25. url(r'^test/', views.test),
  26. # 新建test.html文件:
  27. <!DOCTYPE html>
  28. <html lang="en">
  29. <head>
  30. <meta charset="UTF-8">
  31. <title>Title</title>
  32. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  33. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  34. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  35. </head>
  36. <body>
  37. {{ a }}
  38. {{ b }}
  39. {{ c }}
  40. {{ d.3.2.hobby.0 }}
  41. {{ e }}
  42. {{ f }}
  43. {{ g }}
  44. {{ h }}
  45. {{ l }}
  46. {{ info }}
  47. </body>
  48. </html>

6. 模板语法之过滤器

  1. # 相当于python里面的内置方法
  2. # 语法:
  3. {{变量|过滤器:参数}}
  4. # 过滤器有很多个,大概有六七十,我们只需要掌握5个左右
  5. 1. length
  6. 2. defalut
  7. 3. date
  8. 4. filesizeformat
  9. 5. safe
  10. # 过滤器里面最大传两个参数,至少一个参数
  11. # 在views.py文件中:
  12. """
  13. def test(request):
  14. c = 'hello world'
  15. f = False
  16. import datetime
  17. ctime = datetime.datetime.now()
  18. gg = 123456789
  19. hh = '<h1>hello<h1>' # 后端加safe 会渲染成h1标签
  20. return render(request, 'test.html', locals())
  21. """
  22. # 在test.html文件中:
  23. <!DOCTYPE html>
  24. <html lang="en">
  25. <head>
  26. <meta charset="UTF-8">
  27. <title>Title</title>
  28. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  29. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  30. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  31. </head>
  32. <body>
  33. {{ c|length }}
  34. {{ f|default:'这是默认值' }}
  35. {#{{ f|default:'这是默认值' }}#}
  36. {{ ctime|date:'Y-m-d H:i:s' }}
  37. {{ gg|filesizeformat }}
  38. {{ hh|safe }}
  39. </body>
  40. </html>

JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器的更多相关文章

  1. 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType

    回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...

  2. vue form表单上传文件

    <script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js">< ...

  3. django 基于form表单上传文件和基于ajax上传文件

    一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...

  4. 使用form表单上传文件

    在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...

  5. form表单上传文件

    一.formData()直接获取form表单数据 例子:获取form表单的id给formData(),然后传给后台. 要求: 传入值的name值必须与后台接受的name相对应. form表单不能嵌套, ...

  6. Java如何解决form表单上传文件,以及页面返回处理结果通知!

    前端JSP代码 <form id='formSumbit' class='form-horizontal' action='/ncpay/route/chlsubmcht/batchImpor' ...

  7. PHP 后台程序配置config文件,及form表单上传文件

    一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...

  8. nodejs 模拟form表单上传文件

    使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...

  9. form表单上传文件使用multipart请求处理

    在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Serv ...

随机推荐

  1. 《剑指offer》面试题55 - II. 平衡二叉树

    问题描述 输入一棵二叉树的根节点,判断该树是不是平衡二叉树.如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 示例 1: 给定二叉树 [3,9,20,null,null, ...

  2. 【reverse】逆向2 寄存器与内存

    [reverse]逆向2 寄存器与内存 1.通用寄存器 主要用途其实没必要记下来,因为只是CPU建议你这么做. 寄存器需要按照顺序被下来 32位就是可以存32个0或1 所以存储范围就是0-0xFFFF ...

  3. 记录一个问题:macos High Sierra 10.13.6 内核内存泄漏,导致内存满而不得不重启

    kernel_task进程占用内存10g以上,使用中突然提示内存不足,要求杀死工作进程,不得不强按电源键来关机重启. 升级之前,版本大约是macos High Sierra 10.13.4, 系统频繁 ...

  4. 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构

    工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...

  5. Using Swap

    # create swap file dd if=/dev/zero of=/.swap bs=1048576 count=4096 # format swap mkswap /.swap # sta ...

  6. Linux 标准输入输出、重定向

    一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...

  7. 推荐召回--基于内容的召回:Content Based

    目录 1. 前言 2. 构建画像 3. 内容召回的算法 1. 前言 在之前总结过协同过滤的召回通路后,今天我们来总结下召回策略中的重头戏:基于内容的召回通路,也即我们常说的基于标签的召回.这里就要涉及 ...

  8. python 元组tuple介绍,使用。

    原文 https://blog.csdn.net/ruanxingzi123/article/details/83184909 一  是什么? # python 元组tuple? ''' 元祖tupl ...

  9. Vue.js开发环境配置与项目创建

    一.需要安装和配置 Node.js 与 npm 二.Vue.js的安装或cdn引用: ·cdn引用(不适合项目开发): <script src="https://cdn.jsdeliv ...

  10. CDN 的缓存与回源机制解析

    CDN的缓存与回源机制解析 CDN (Content Delivery Network,即内容分发网络)指的是一组分布在各个地区的服务器.这些服务器存储着数据的副本,因此服务器可以根据哪些服务器与用户 ...