This theme is built with awes|

django版本区别,JsonResponse对象,form表单上传文件,request其他方法,FBV与CBV,模板语法传值

虚拟环境

我们在实际开发工作中 针对不同的项目需要为其配备对应的解释器环境
	eg:
          项目1 
          	django2.2 pymysql3.3 requests1.1
          项目2 
          	django1.1
          项目3
          	flask
诸多项目在你的机器上如何无障碍的打开并运行
  方式1:把所有需要用到的模块全部下载下来 如果有相同模块不同版本每次都重新下载替换
  方式2:提前准备好多个解释器环境 针对不同的项目切换即可
 
# 创建虚拟环境 
	相当于在下载一个全新的解释器
# 识别虚拟环境
	文件目录中有一个venv文件夹
# 如何切换环境
	选择不用的解释器即可 全文不要再次勾选new enviroment...

django版本区别

路由的区别
        - django1.X版使用的是url函数
        - django2.x版使用的是re_path与path
从2.x以后,建议使用path——是一个准确路径,path() 第一个参数不支持正则。

from django.urls import path,re_path
如果使用正则方式,建议使用re_path,用法与1.x的url完全一致。

path转化器

五个内置转化器
    - str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    - int:匹配正整数,包括0
    - slug:匹配字母、数字、下划线以及横杠组成的字符串
    - uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
    - path:匹配任何非空字符串,包含了路径分隔符(/),不能用"?"


path('articles/<int:year>/', views.year_archive),
<int:year>相当于一个有名分组,其中int是django提供的转换器,相当于正则表达式,专门用
于匹配数字类型,而year则是我们为有名分组命的名,并且int会将匹配成功的结果转换成整型后按照
格式(year=整型值)传给函数year_archive


实现匹配这种路径:http://127.0.0.1:8000/L/p/4444.html
    - path('<str:name>/p/<int:id>.html', views.lpgin),
    - re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
    - url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
    # url在2.x之后的版本不建议使用,可以使用re_path代替

'''转化器不能在re_path中使用'''

JsonResponse对象

使用前需要导入模块
from django.http import JsonResponse
JsonResponse
	
	- 主要用于前后端交互发送数据
	
    - 使用json模块来返回json格式的数据
        def test_json(request):
            import json
            user_dict = {'user': '王', 'password': 123456}
            # ensure_ascii=True会将中文转换为编码 {"user": "\u738b", "password": 123456}
            json_str = json.dumps(user_dict, ensure_ascii=False)
            return HttpResponse(json_str)
    - 使用Django的JsonResponse对象实现
        def test_json(request):
            from django.http import JsonResponse
            user_dict = {'user': '王', 'password': 123456}
            # JsonResponse 的传值方式 将json.dumps()中的参数用字典方式传送
            return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})
    - 将非字典格式的序列通过JsonResponse对象传值
        def test_json(request):
            from django.http import JsonResponse
            ls = [i for i in range(10)]
            # JsonResponse 的传值方式 将json.dumps()中的参数用字典方式传送
            # 非字典序列必须设置参数 safe=False
            return JsonResponse(ls, json_dumps_params={'ensure_ascii': False}, safe=False)

form表单上传文件

form表单上传的数据中如果含有文件 那么需要做以下几件事
  1.method必须是post
  2.enctype必须修改为multipart/form-data
  	默认是application/x-www-form-urlencoded
  3.后端需要使用request.FILES获取

案例

前端:
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="f1">   
    <button>上传</button>
</form>

后端:
def index(request):
    if request.method == 'POST':
        file = request.FILES.get('f1') # 获取文件对象
        with open(file.name, 'wb') as f: #file.name上传文件的源文件名
            for i in file:
                f.write(i)
    return HttpResponse('ok')

request其他方法

request.body
	存放的是接收过来的最原始的二进制数据
  '''request.POST、request.GET、request.FILES这些获取数据的方法其实都从body中获取数据并解析存放的'''

针对这个网址:https://pythondjango.cn/blog/articles/?page=2
request.path
	获取路径
'''
  request.path仅提供相对于根目录的url相对路径,不包含参数。它的输出是一个字符串,结果如下所示:

  '/blog/articles/'
'''


request.path_info
	获取路径
'''
  request.path_info也仅提供相对于根目录的url相对路径,不含参数。它的输出也是一个字符
串,与request.path相同:

  '/blog/articles/'
'''
request.get_full_path()
	获取路径并且还可以获取到路径后面携带的参数
'''
  request.get_full_path

  该方法用于获取包含完整参数的相对于根目录的相对url路径。它的直接输出内容是个WSGI请求对
象。如果要获取字符串形式的完整url路径,一定要不要忘了在后面加括号。

  request.get_full_path()的输出结果为:

  'blog/articles/?page=2'
'''

FBV与CBV

FBV

FBV,即 func base views,函数视图,在视图里使用函数方法处理请求。
我们平时在写前后端不分离项目的时候,视图中的方法基本上都是使用的FBV方法,相对于易于理解的
角度来讲,FBV确实是比较好理解一些,对于一些实现的功能相近,但是功能单一的项目来讲,基本是
完全够使用的,基本的示例如下所示:
def order(request):
  if request.method =='GET":
    return HttpResponse(获取订单')
  elif request.method =="POST":
    return HttpResponse("创建订单')

CBV

CBV,即 class base views ,类视图,就是在视图里使用类方法处理请求。
需要导入一个View类,通过自定义一个子类继承这个类,我们可以利用View里面的dispatch()方法
来判断请求是get还是post。dispatch方法的本质是一个反射器,可以根据名字来调用同名的方法。

View类的部分代码可以看出dispatch通过反射获取列表里面的方法名称
'''
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
'''

CBV案例


from django.views import View
class Home(View):  
    def get(self,request):
        print(request.method)
        return render(request, 'home.html')
        
    def post(self,request):
        print(request.method,'POST')
        return render(request, 'home.html')

为了调用自定义的类里面的方法,在url里面,我们需要调用View类的as_view()方法作为入口。

from django.conf.urls import url
from myapp.views 
import MyView
urlpatterns = [
    url(r'^about/', MyView.as_view()),
]

CBV执行原理(as_view())

以上面的案例为例
1.首先在项目启动时就会执行一次as_view方法,通过对as_view方法源码的查看,我们可以得知是返回一个闭包函数名view。
'''
源码
@classonlymethod
    def as_view(cls, **initkwargs):
          ......
          def view(request, *args, **kwargs):
              ......
          return view
'''
那么此时的urls.py文件中的配置就相当与,url('^Myviews$',views.Myviews.view),这也说明了CBV与FBV在路由匹配本质是一样的。
2.在路由匹配成功后,会执行view函数会return self.dispatch(request, *args, **kwargs),也就是会执行dispatch函数。
'''
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)
'''
3.dispatch():中  通过 getattr 反射 拿到 子类的 get 或post 方法   给到handler 再返回执行,
          1.判断请求方法 是否存在于  http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

          2. 如果存在 就执行子类 中对应的方法(get,post.......)

          3.handler = getattr(self, request.method.lower(), self.http_method_not_allowed) 

               此时handler 就是一个 方法    return  handler (request ,*args,**kwargs) 加括号执行

'''
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
'''

模板语法传值

语法格式

{{ }} :变量相关,主要用于变量相关操作(引用)
{% %} :逻辑相关,主要用于逻辑相关操作(循环、判断)

传值的两种方式

传值方式1:指名道姓的传  适用于数据量较少的情况       节省资源
return render(request, 'ab_temp.html', {'name':name})
传值方式2:打包传值  适用于数据量较多的情况(偷懒)     浪费资源
  '''locals() 将当前名称空间中所有的名字全部传递给html页面'''
  return render(request, 'ab_temp.html', locals())

传值的范围

  基本数据类型都可以
  函数名
  	模板语法会自动加括号执行并将函数的返回值展示到页面上
    不支持传参(模板语法会自动忽略有参函数)
  文件名
  	直接显示文件IO对象
  类名
  	自动加括号实例化成对象
  对象名
  	直接显示对象的地址 并且具备调用属性和方法的能力

  django模板语法针对容器类型的取值 只有一种方式>>>:句点符
  	既可以点key也可以点索引  django内部自动识别
  {{ list.0 }} #获取列表第一个值

本文作者:春游去动物园

本文链接:https://www.cnblogs.com/chunyouqudongwuyuan/p/16267755.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   春游去动物园  阅读(113)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开
  1. 1 生分 川青
生分 - 川青
00:00 / 00:00
An audio error has occurred.

生分 - 川青

词:莎子

曲:邵翼天

编曲:林亦

混音:罗杨轩

吉他:林亦

制作人:谢宇伦

监制:曾炜超/陈显

策划:+7

统筹:黄染染

出品:漫吞吞文化

『酷狗音乐人 • 星曜计划』

全方位推广,见证星力量!

「版权所有未经许可 不得商业翻唱或使用」

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

有些话一开口会伤人

有些话一开口会伤人

所以我选择默不作声

所以我选择默不作声

爱一个人

若甘愿陪衬

甘愿牺牲

也许换个名分

也不是没可能

我不怕在爱里做个蠢人

我不怕在爱里做个蠢人

也不怕爱过之后再分

也不怕爱过之后再分

爱一个人

有万种身份

万种可能

只是没想到

我们最后友人相称

我们怎么变得那么生分

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言

见缝插针

怕不小心我们

成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

有些话一开口会伤人

有些话一开口会伤人

所以我选择默不作声

所以我选择默不作声

爱一个人

若甘愿陪衬

甘愿牺牲

也许换个名分

也不是没可能

我不怕在爱里做个蠢人

我不怕在爱里做个蠢人

也不怕爱过之后再分

也不怕爱过之后再分

爱一个人

有万种身份

万种可能

只是没想到我们最后

友人相称

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言见缝插针

怕不小心我们成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

我们怎么变得那么生分

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言见缝插针

怕不小心我们成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡