昨日内容回顾

  • Django请求生命周期
# 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口)
01 wsgiref
02 uwsgi + nginx
03 WSGI协议 # 2.Django框架
01 中间层
02 路由层
django1.x:url('正则表达式','视图函数的内存地址')
django2.x:
path() => 精准匹配
re_path => url => 支持正则表达式
03 视图层:views.py
04 模板层:页面
05 模型层:数据
06 DB
  • 路由层
1. url()
2. 无名分组和有名分组:
无名分组: 就是把正则表达式用括号括起来,当成位置参数传递给视图函数
有名分组: 就是把正则表达式用括号括起来,当成关键字参数传递给视图函数
url('test/(?P<path>\d+)') 3. 反向解析
通过给路由起一个别名,通过解析别名得到该行锁对应的路由地址 4. 无名和有名反向解析
  • 路由分发
# 当django项目特别大的时候,就会出现许多的路由地址,总路由的压力就会很大
django的每一个应用都支持有自己的路由文件,模板文件,static文件... 总路由就只负责分发路由,不再做路由地址与视图函数的对应关系 eg:
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from app03 import urls as app03_urls url('app01/', include(app01_urls))
url('app02/', include(app02_urls)) http://127.0.0.1:8000/app01/v1/v2/index url('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'''
# 序列化出来的数据是可以看得懂的,就是一个字符串
四种方法:
dumps
loads dump
load 02 import pickle
'''支持的数据类型:python中的所有数据类型'''
# 序列化出来的结果看不懂,因为结果是一个二进制
# pickle序列化出的来的数据只能在python中使用
四种方法:
dumps
loads dump
load # js中如何序列化?
JSON.stringify() # 序列化
JSON.parse() # 反序列化 # JsonResponse 类使用演示
1.传输字典 但字典内容包含中文
在 views.py文件中写入:
"""
from django.shortcuts import render, HttpResponse, redirect
# Create your views here. from django.http import JsonResponse def 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 views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]
""" 2.传输列表
在 views.py文件中写入:
"""
from django.http import JsonResponse def 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. urlencoded
2. form-data
3. json格式 form表单可以传递的数据格式:
1. urlencoded
2. form-data
# 不能提交json格式的数据 提交json格式的数据:
1. ajax
2. 第三方工具
postman
apizza
""" # 在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 View class 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 => IndexView
return self.dispatch(request, *args, **kwargs) ##############核心方法################################
def dispatch(self, request, *args, **kwargs):
# GET POST => get post
if request.method.lower() in self.http_method_names:
# 反射:get set has del
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # get(request, *args, **kwargs)

5. 模板语法之传值

# 传值
跟变量相关的都使用双括号 {{}}
跟逻辑相关的都使用 {% %}
'''模板文件中取值一律使用点语法 . '''
在模板文件里面的函数,不用加括号,会自动加括号调用, 不能传递参数 # 在views.py文件中添加:
"""
def test(request):
# user_dict = {'a':1}
a = 11
b = 1.11
c = 'hello world'
d = [1, 2, 3, ['a', 'b', {'hobby': ['football', 'baseball']}]]
e = {'username': 'ly'}
f = True
g = (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. length
2. defalut
3. date
4. filesizeformat
5. safe # 过滤器里面最大传两个参数,至少一个参数 # 在views.py文件中:
"""
def test(request):
c = 'hello world'
f = False import datetime
ctime = datetime.datetime.now()
gg = 123456789
hh = '<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>

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. winform 中心旋转 图片旋转

    //设置左上角到中心点 g.TranslateTransform(int.Parse(x), int.Parse(y)); //旋转角度 g.RotateTransform(int.Parse(&qu ...

  2. 前端——JSON学习总结

    学习网址: https://www.bilibili.com/video/BV1Pt411u7R3 什么是JSON?(以下有关概念内容为视频中学习文档相关内容,代码为本人学习时使用的有关代码) JSO ...

  3. 2月1日 体温APP开发记录

    1.阅读构建之法 现代软件工程(第三版) 2.观看Android开发视频教程最新版 Android Studio开发

  4. 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III

    Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...

  5. node.js和vue cli脚手架下载安装配置方法

    一.node.js安装以及环境配置 1.下载vue.js 下载地址: https://nodejs.org/en/ 2.安装node.js 下载完成后,双击安装包开始安装.安装地址最好换成自己指定的地 ...

  6. gin框架使用Air实时加载

    Air实时加载 本章我们要介绍一个神器--Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率. 1.1.1. 为什么需要实时加载? 之前使用Pyt ...

  7. 常见Web服务器

    常见Web服务器

  8. IoC容器-Bean管理XML方式(注入空值和特殊符号)

    Ioc操作Bean管理(xml注入其他类型属性), 字面量 (1)null值 (2)属性值包含特殊符号

  9. 如何快速将数据用逗号隔开——巧用EXCEL

    问题是这样的,下图是爬虫获得的数据,注意该数据存储在CSV格式的EXCEL表格中,单元格中的数据每四个代表一个点的经纬度,但是很明显它现在的这个形式是没法利用的, 因此需要对数据进行挖掘,提取出经纬度 ...

  10. Vue之JavaScript基础(闭包与原型链)

    闭包 定义:能够访问另一个函数作用域的变量的函数. 作用:可以通过闭包,设计私有变量及方法 实例: function outer() { var a = '变量1' var inner = funct ...