首页 > 其他分享 >Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件

Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件

时间:2022-12-13 21:35:04浏览次数:41  
标签:文件 return FBV get 对象 self request 视图 view

目录

虚拟环境

每创建一个虚拟环境类似于重新下载了一个纯净的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方法
      
 

我们就剖析出,我们的as_view()函数做了这么几件事:

封装了一个函数,作为对应路由的函数
封装的函数中,让我们的自定义类产生了一个对象,并让对象执行方法dispatch返回结果
dispatch辨认了请求方式,根据请求方式返回了某个类体函数的结果(HttpResponse对象)

标签:文件,return,FBV,get,对象,self,request,视图,view
From: https://www.cnblogs.com/moongodnnn/p/16980680.html

相关文章

  • 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源、视图和消息器
     在上一篇博文​​《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1)-数据源与事务管理》​​中我们介绍了怎么基于Java代码去设计和配置一个具有可扩展性的数......
  • Django路由层之路由分发 名称空间 虚拟环境 视图层之三板斧 JsonRsponse对象 request
    目录路由层之路由分发路由层之名称空间方式1:名称空间方式2:别名不冲突即可路由层之虚拟环境pycharm创建虚拟环境命令行形式创建虚拟环境视图层之三板斧HttpRsponserenderred......
  • 【CAD开发】3dxml文件格式开发准备
    文章目录​​1、简介​​​​2、3DXML查看工具​​​​2.13DXMLPlayer​​​​2.2PixyzStudio​​​​3、3DXML开发用户手册​​​​3.1Model_3dxml​​​​3.2Model......
  • django之视图层
    django之视图层视图函数结构视图函数的参数与返回值每一个用来处理请求的视图函数,默认都需要一个request形参来接收request对象。每一个用来处理请求的视图函数必须返......
  • django之视图层
    目录django之视图层视图层必会三板斧JsonResponse对象request对象获取文件FBV与CBVCBV源码解析django之视图层视图层必会三板斧用来处理请求的视图函数都必须返回HttpRe......
  • 使用qemu搭建ARM64调试环境,支持文件共享,支持gdb调试
    环境主机ubuntu版本:20.04qemu模拟处理器:ARM64Linux内核版本:https://www.kernel.org/最新版step1:安装编译工具链sudoapt-getinstallgcc-aarch64-linux-gnusudoapt-......
  • django 4 视图层
    今日内容详细目录今日内容详细视图层视图层之三板斧JsonResponse对象视图层之request对象获取文件视图层之FBV与CBVCBV源码剖析模板层模板语法之传值操作模板语法之传值特......
  • 【787】mac 查看、修改文件权限的命令
    参考:mac查看、修改文件权限的命令查看文件/文件夹权限:1、查看某个文件权限的命令ls-l+要查看文件的文件名2、查看某个文件夹里所有文件/文件夹的权限ls-l+文件......
  • 视图层
    昨日内容回顾数据增删改查可视化界面1.request对象方法 request.GET\request.POST\request.method2.数据库迁移命令 makemigrations\migrate3.form表单提交数据......
  • 【GIS开发】Esri Shapefile(.shp)矢量数据文件读取(C++、Python)
    文章目录​​1、简介​​​​1.1什么是Shapefile​​​​1.2格式分析​​​​1.3资源下载​​​​2、C++​​​​2.1shapelib​​​​2.2gdal​​​​3、Python​​​......