JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器
昨日内容回顾
- 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的模板语法之传值与过滤器的更多相关文章
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- vue form表单上传文件
<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js">< ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- 使用form表单上传文件
在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...
- form表单上传文件
一.formData()直接获取form表单数据 例子:获取form表单的id给formData(),然后传给后台. 要求: 传入值的name值必须与后台接受的name相对应. form表单不能嵌套, ...
- Java如何解决form表单上传文件,以及页面返回处理结果通知!
前端JSP代码 <form id='formSumbit' class='form-horizontal' action='/ncpay/route/chlsubmcht/batchImpor' ...
- PHP 后台程序配置config文件,及form表单上传文件
一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...
- nodejs 模拟form表单上传文件
使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...
- form表单上传文件使用multipart请求处理
在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Serv ...
随机推荐
- 《剑指offer》面试题46. 把数字翻译成字符串
问题描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...
- Cesium中文网的朋友们
目前已开通知识星球-Cesium中文网的朋友们 注意:仔细思量好再进来,一旦付费,概不退费.下述内容均尽力而为. 1. 每月一次技术交流(Cesium为主),提供源码. 2. 每人5次/周免费提问(C ...
- Ajax的IE缓存问题
Ajax之IE缓存问题 <!-- IE浏览器会对ajax的结果进行一个缓存,这样就会导致一个缓存问题 浏览器会读取缓存 而不会去使用一个新的数据 这样对一个时效性比较强的场景 ajax的缓存会影 ...
- 加深对AQS原理的理解示例一:实现一个独占锁
/** *@Desc * 这个自定义的独占锁 只是一个简单的版本,非常粗糙,只为了加深对AQS原理理解.但还有一些列问题有待解决,比如锁的重入,锁不允许被其他线程中断等! *@Author zhang ...
- java单例模式(饿汉式和懒汉式)
1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...
- Java 线程学习笔记
1.什么是线程 进程: 一个正在运行的程序就叫一个进程. 每个进程都有独立的内存空间. (进程是资源分派的基本单位) 线程: 一个进程中可以有很多线程.----> 常说的多线程 线程没有独立的内 ...
- 使用gdi+实时绘制picturebox(画个叉)
private void DrawReticle(System.Drawing.Point pt, int size)//画一个透明的前景图片上画十字 { Bitmap bmp = new Bitma ...
- ApacheCN Kali Linux 译文集 20211020 更新
Kali Linux 秘籍 中文版 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第四章 信息收集 第五章 漏洞评估 第六章 漏洞利用 第七章 权限提升 第八章 ...
- ApacheCN 计算机视觉译文集 20210212 更新
新增了六个教程: OpenCV 图像处理学习手册 零.前言 一.处理图像和视频文件 二.建立图像处理工具 三.校正和增强图像 四.处理色彩 五.视频图像处理 六.计算摄影 七.加速图像处理 Pytho ...
- react之每日一更(实现canvas拖拽,增、删、改拖拽模块大小功能)
效果图: import React, { Component } from 'react'; import scaleImage from './images/scale.png'; import c ...