Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件
虚拟环境
每创建一个虚拟环境类似于重新下载了一个纯净的python解释器
但虚拟环境不要创建太多,会占用电脑硬盘空间
项目1需要使用:django1.11 python38
项目2需要使用:django2.22 pymysql requests python38
项目3需要使用:django3.22 request_html flask urllib3 python38
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
在CMD终端创建虚拟环境: python -m venv pyvenv38
视图层views
三板斧
HttpResponse
用来处理请求的视图函数都必须返回HttpResponse对象
返回字符串类型
render
返回html页面 还可以给页面传值
redirect
重定向
jsonResponse对象
前后端数据交互需要用到json格式
def ab_json(request):
user_dict = {'username':'月神','age':18}
json_str = json.dumps(user_dict,ensure_ascii=False)
return HttpResponse(json_str)
from django.http import JsonResponse
return JsonResponse(user_dict)
使用jsonresponse方法可以直接发送数据,但是遇到文字会乱码
如何解决乱码
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':false})
直接在json_dumps_params这个方法里面传入 'ensure_ascii':false 就可以了
如何传送列表
l1 = [11,22,33,44]
return JsonResponse(l1,safe=False)
其实通过看源码和报错都可以推导出来这些问题
form如何上传文件/request对象获取文件
form表单上传文件
<form action='' method='post' enctype ='multipart/form-data'>
首先必须是post请求 然后设置enctype ='multipart/form-data'属性
< input type='file' name='file'>
前端获取文件,
后端获取文件
file_obj = request.FILES.get('file)
可以获得前端发来的文件对象
如何存储文件
with open(file_obj.name,'wb') as f:
for line in file_obj:
f.write(line)
这样就保存好了前端发来的文件
request对象方法
request.method
获取请求方式
request.POST
获取post请求提交的普通键值对数据 不包括文件
request.GET
获取get请求
request.FILES
获取文件
request.path
获取用户访问的路由
request.path_info
request.get_full_path()
获取用户访问的路由及问号后面携带的参数
FBV与CBV
FBV:基于函数的视图;
CBV:基于类的视图;
使用函数实现功能
def index(request):
return render(request,'login.html')
使用面向对象思想通过类实现功能
from django.views import View
#需要导入django.views import View模块
class Mylogin(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return render(request,'login.html')
使用CBV路由匹配时
urlpatterns = [
path('login/', views.Mylogin.as_view()),
]
#访问路由 直接访问这个类 然后执行类里面的方法
'''
FBV和CBV各有千秋
CBV特点能够直接根据请求方式不同匹配到对应的方法执行
CBV源码解析
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return render(request,'login.html')
使用 CBV 时,需要 通过 视图类. as_view() 才能进行路由匹配,那么直接观察这个as_view()的源码
urlpatterns = [
path('login/', views.Mylogin.as_view()),
] # as_view() 是一个绑定给 类的方法
# 由于加了()相当于立即执行了类里面的这个函数方法。
@classonlymethod
def as_view(cls,**initkwargs):
def view():
return view
观察返回值能够发现,返回的是内部的一个view函数
通过这里得出结论path('login/', views.Mylogin.as_view()),
相当于 path('login/', views.view),
因为Mylogin.as_view()执行完返回值是view
所以 CBV 路由匹配的本质,就是 FBV
接下来,我们分析一下,当路由匹配成功时,需要执行的这个view函数的源码
@classonlymethod
def as_view(cls, **initkwargs):
... ... # 源码省略
def view(request, *args, **kwargs):
self = cls(**initkwargs) -----> '实例化生成一个对象'
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get ----> '给生成的对象添加 head 属性'
self.request = request --> '给生成的对象添加 request 属性'
self.args = args ----> '给生成的对象添加 args 属性'
self.kwargs = kwargs ----> '给生成的对象添加 args 属性'
return self.dispatch(request, *args, **kwargs)
... ... # 源码省略
return view
最后结果就是 return self.dispatch(request, \*args, \**kwargs)
对象 和 产生对象的 类中都没有 dispatch函数,所有需要到 父类view中去找
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
# 判断当前请求的方法是否符合 8 个 默认的请求方法
handler = getattr(self, request.method.lower(),
# getattr反射
# sele是自己写的类产生的对象 查找get方法,自己写的对象没有 就找对象的父类 也就是我们自己写的类 然后有 get 执行我们类里面的get方法
# handler = 等于我们自己写的get方法
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
# 触发我们函数内部的get方法
Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件的更多相关文章
- JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器
昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传
Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV 在Django中存 ...
- 【jQuery】form表单元素序列化为json对象
序列化form表单元素为json对象: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head&g ...
- jQuery将form表单的数据封装成json对象
/** * 自动将form表单封装成json对象 */ $.fn.serializeObject = function() { var o = {}; var a = this.serializeAr ...
- Django表单上传
任务描述:实现表单提交(上传文件) 1.项目目录: 2.源代码: regist.html <!DOCTYPE html> <html lang="en"> ...
- Django视图之FBV与CBV
一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...
- Form表单如何传递List数组对象到后台的解决办法(转)
举例说明: [后台有一个对象 User 一个PhotoDo对象],结构如下: public class User{ private String username; private List&l ...
- form表单在前台转json对象
会发生序列化乱码问题,待解决. //根据表单id将其内空间,名称,值转为json var fireTraceEquipment =queryParamByFormId('form1'); functi ...
- MVC Form 表单 提交 集合 及 复杂对象
public class Customer { public string FName{get;set;} public Address address{get;set;} } public clas ...
随机推荐
- 微信小程序第三方授权登录
登录流程时序图: 1.调用uni.getProvider()获取服务供应商,参数service确定是选择对应的什么操作,此处选择授权登录oauth 代码如下: 2.调用登录接口uni.login(), ...
- GC plan_phase二叉树挂接的一个算法
楔子 在看GC垃圾回收plan_phase的时候,发现了一段特殊的代码,仔细研究下得知,获取当前数字bit位里面为1的个数. 通过这个bit位为1的个数(count),来确定挂接当前二叉树子节点的一个 ...
- MatrixOne从入门到实践02——源码编译
MatrixOne从入门到实践--源码编译 在部署MatrixOne前,我们可能会比较纠结使用哪个版本合适,MatrixOne在github上有各个版本的Releases,包含源码包和适用于Lin ...
- C语言------循环结构II
仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4 .小结 1 .实训名称 实训6: ...
- 在js中正则表达式验证小时分钟,将输入的字符串转换为对应的小时和分钟
文章目录 1.预备知识 2.在js中的代码片段 3.测试结果 1.预备知识 splict()方法 Date()的相关方法 setHours()的用法 2.在js中的代码片段 //验证小时和分钟 var ...
- CVE-2021-44832 log4j_2.17.0 RCE复现与吐槽
先说一句,这傻x洞能给cve就离谱,大半夜给人喊起来浪费时间看了一个小时. 先说利用条件: 需要加载"特定"的配置文件信息,或者说实际利用中需要能够修改配置文件(你都能替换配置文件 ...
- letcode刷题记录-day03-罗马转整数
题目 罗马转整数 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 ...
- Linux系统安装python
1. 安装python3 1.1 下载python3安装包及其依赖包(该步骤可忽略,步骤1.2 提供应用包链接) ① 在python官网下载所需的python3,或者用外网centos机器的wget命 ...
- spring源码解析(一) 环境搭建(各种坑的解决办法)
上次搭建spring源码的环境还是两年前,依稀记得那时候也是一顿折腾,奈何当时没有记录,导致两年后的今天把坑重踩了一遍,还遇到了新的坑,真是欲哭无泪;为了以后类似的事情不再发生,这次写下这篇博文来必坑 ...
- C#与Halcon联合编程之用PictureBox控件替代HWindowControl控件
在使用HALCON和C#联合编程,有时候要使用halcon的HWindowControl控件,但是我发现,HWindowControl的图片显示控件,不能使用GDI+绘制ROI,不知道为什么,反正我测 ...