Welcome!!!

F

伞兵一号,申请出战

Django(四)

Django(四)

虚拟环境

我们在实际开发工作中,会遇到多个项目需要启动的情况,这多个项目如果需要的解释器环境不一样怎么办?

# 配置虚拟环境
	当出现上述情况,我们可以配置虚拟环境,即创建一个虚拟的python环境,再安装所需的框架,插件即可
    
# 识别虚拟环境
	文件目录中有一个venv文件夹
    
# 如何切换环境
	选择不用的解释器即可 全文不要再次勾选new enviroment...

Django版本的区别

# 路由层匹配方法
	1.x版本url支持正则,2.x,3.x不支持正则,如果想使用正则,可以使用re_path模块
    
    path模块提供个了转换器功能
    path('index/<int:id>/', index)

五个转换器

名称 功能
str 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int 匹配正整数,包括0
slug 匹配字母、数字、下划线以及横杠组成的字符串
uuid 匹配格式化uuid
path 匹配任何非空字符串,包含了路径分隔符/,不能用?

JSONResponse对象

# 视图函数必须返回一个HttpResponse对象
	HttpResponse:
    	class HttpResponse(...):
      		pass
        
    render:
        def render(...):
      		return HttpResponse(...)
        
    redirect:
        def redirect(...):
            # 多继承
            
# JsonResponse对象
	def jr(request):
        dict = {'name':'petter','age':18,'gender':'male'}
        return JsonResponse(dict,json_dumps_params={'ensure_ascii':'utf8'})

class JsonResponse(HttpResponse):
	def __init__(self, data,json_dumps_params=None, **kwargs):
		data = json.dumps(data, **json_dumps_params)
        '''**json_dumps_params可以用来传其他参数'''

form表单上传文件

form表单上传的数据中如果含有文件 那么需要做以下几件事
	1.method必须是post
  2.enctype必须修改为multipart/form-data
  	默认是application/x-www-form-urlencoded
  3.后端需要使用request.FILES获取
  	# django会根据数据类型的不同自动帮你封装到不同的方法中

request其他方法

request.method
	获取纯大写请求方式
request.POST
	获取post请求参数
request.GET
	获取get请求参数
request.FILES
	获取文件
request.body
	获取接收到的最原始的二进制数据
request.path
	获取路径
request.path_info
	获取路径
request.get_full_path()
	获取路径并且还可以获取到路径后面携带的参数

FBV与CBV

FBV:基于函数的视图
    url(r'^index/',函数名)
CBV:基于类的视图
    from django import views
	class MyLoginView(views.View):
        def get(self,request):
            return HttpResponse('get')

        def post(self,request):
            return HttpResponse('post')
        url(r'^view/', views.MyLoginView.as_view())
        """
        如果请求方式是GET 则会自动执行类里面的get方法
        如果请求方式是POST 则会自动执行类里面的post方法
        """

CBV源码剖析

1.切入点:路由匹配
  类名点属性as_view并且还加了括号
  	as_view可能是普通的静态方法
    as_view可能是绑定给类的方法
2.对象查找属性的顺序
	先从对象自身开始、再从产生对象的类、之后是各个父类
  	MyLoginView.as_view()
    	先从我们自己写的MyLoginView中查找
     	没有再去父类Views中查找
3.函数名加括号执行优先级最高
	url(r'^view/', views.MyLoginView.as_view())
  项目已启动就会执行as_view方法 查看源码返回了一个闭包函数名view
  def as_view(cls):
    def view(cls):
      pass
    return view
  url(r'^view/', views.view)
  # CBV与FBV在路由匹配本质是一样的!!!
4.路由匹配成功之后执行view函数
	def view():
    self = cls()
    return self.dispatch(request, *args, **kwargs)
5.执行dispatch方法
	需要注意查找的顺序!!!
  def dispatch():
      handler = getattr(self, request.method.lower())
      return handler(request, *args, **kwargs)
"""查看源码也可以修改 但是尽量不要这么做 很容易产生bug"""

模板语法传值

"""
django提供的模板语法只有两个符号
	{{}}:主要用于变量相关操作(引用)
	{%%}:主要用于逻辑相关操作(循环、判断)
"""
# 传值的两种方式
1.知名道姓传(适用于数据量少的情况)
eg:
    return render(request, 'user.html', {'name':name})
2.打包传值
eg:
    name = 'petter'
    return render(request, 'ab_temp.html', locals())
	locals():将当前名称空间中的所有名字传给前端
        
# 传值范围
	基本数据类型都可以传值
    函数名
    	相当于把函数的返回值传过去,不支持对函数进行传参
    文件名
    	直接显示文件IO对象
    类型
    	相当于传递实例化的对象
    对项目
    	直接显示对象的地址,并且具备调用属性和方法的能力
     
# django模板语法针对容器类型的取值 只有一种方式>>>:句点符
	既可以点key也可以点索引  django内部自动识别
  	{{ user.3.username }}
posted @ 2022-05-15 17:01  程序猿伞兵一号  阅读(28)  评论(0)    收藏  举报