Django框架04

虚拟环境

为了解决版本共存问题

  1. 用pycharm选择virtualenv创建一个纯净环境
  2. 将环境copy到需要指定长期使用的文件夹下
  3. 再次创建项目时,将该环境添加到pycharm环境选择中
  4. 为该环境添加需要处理的版本共存包

第一步:

 

 

 第二步:等待copy虚拟环境

 

 

 第三步:出现虚拟环境就安装成功了

 

 

也可以通过命令行的方式创建虚拟环境:

复制代码
'''

1.通过pip3安装虚拟环境:
    -- pip3 install virtualenv
2.前往目标文件夹:
    -- cd 目标文件夹  (C:\Virtualenv)
3.创建纯净虚拟环境:
    -- virtualenv 虚拟环境名 (py3-env1)
了解:创建非纯净环境:
    -- virtualenv-clone 本地环境 虚拟环境名
4.终端启动虚拟环境:
    -- cd py3-env1\Scripts
    -- activate
5.进入虚拟环境下的python开发环境
    -- python3
6.关闭虚拟环境:
    -- deactivate
7.PyCharm的开发配置
    添加:创建项目 -> Project Interpreter -> Existing interpreter -> Virtualenv Environment | System Interpreter -> 目标路径下的python.exe
    删除:Setting -> Project -> Project Interpreter -> Show All
'''
复制代码

Django的版本区别

django1.x与2.x、3.x有些许区别。

路由层配置:

url(),支持正则;path()的第一个参数不支持正则;

如果想使用正则,也提供了方法>>>:from django.urls import path,re_path

path方法提供了转换器功能:

path('index/<int:id>/', index)

匹配对应位置的数据并且自动转换类型。

视图函数的返回值

 视图函数必须返回一个HttpResonse对象。

HttpResponse
class HttpResponse(...):
  pass
  render
def render(...):
  return HttpResponse(...)
  redirect
 def redirect(...):

JsonResponse对象

user_dict = {'name': 'jason', 'pwd': 123, 'hobby': '好好学习'}
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})

class JsonResponse(HttpResponse):
def __init__(self, data,json_dumps_params=None, **kwargs):
data = json.dumps(data, **json_dumps_params)

 

form表单上传文件

form表单上传的数据中如果含有文件,那么需要做以下几件事。

  1. method必须是post
  2. enctype必须修改为multipart/form-data,默认是application/x-www-form-urlencoded。
  3. 后端需要使用request.FILES获取。
前端:upload.html页面
1.往自身路径发送post请求,要将第四个中间件注释
2.multipart/form-data格式允许发送文件
3.multiple属性表示可以多文件操作
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="files" multiple="multiple">
    <input type="submit" value="上传">
</form>
复制代码
后台:re_path('^upload/$', upload)
def upload(request):
    if request.method == "GET":  
        return render(request, 'upload.html')
    if request.method == "POST":
        # 如果一个key对应提交了多条数据,get取最后一个数据,getlist取全部数据
        last_file = request.FILES.get('files', None)
        files = request.FILES.getlist('files', None)
        # import django.core.files.uploadedfile.TemporaryUploadedFile
        # file是TemporaryUploadedFile类型,本质是对系统file类封装,就是存放提交的文件数据的文件流对象
        for file in files:  
            with open(file.name, 'wb') as f:
                for line in file:  # 从file中去数据写到指定文件夹下的指定文件中
                    f.write(line)
        return HttpResponse('上传成功')
复制代码

request其他方法

复制代码
'''
1. method: 请求方式
2. GET: get请求的参数
3. POST: post请求的参数(本质是从bdoy中取出来)
4. body: post提交的数据(不能直接查看)
5. path: 请求的路径,不带参数
6. request.get_full_path(): 请求路径,带参数
7. FILES: 文件数据
8. encoding: 编码格式
9. META: 数据大汇总的字典
'''
复制代码

 

FBV与CBV

 FBV:Function base views 函数方式完成视图响应。

CBV:Class base views 类方式完成视图响应。

from django import views
class MyLoginView(views.View):
def get(self, request):
    return HttpResponse("from CBV get view")
def post(self, request):
    return HttpResponse("from CBV post view")
url(r'^ab_cbv/', views.MyLoginView.as_view())

 

CBV源码剖析

切入点:路由匹配。

类名点属性as_view并且还加了括号。

'''
as_view可能是普通的静态方法
as_view可能是绑定给类的方法
'''

对象查找属性的顺序。

先从对象自身开始、再从产生对象的类、之后是各个父类。

'''
MyLoginView.as_view()
先从我们自己写的MyLoginView中查找
没有再去父类Views中查找
'''

函数名加括号执行优先级最高。

复制代码
'''
url(r'^ab_cbv/', views.MyLoginView.as_view())
项目已启动就会执行as_view方法 查看源码返回了一个闭包函数名view
def as_view(cls):
def view(cls):
  pass
  return view
url(r'^ab_cbv/', views.view)
# CBV与FBV在路由匹配本质是一样的!!!
'''
复制代码

路由匹配成功之后执行view函数。

'''
def view():
self = cls()
  return self.dispatch(request, *args, **kwargs)
'''

执行dispatch方法。

'''
需要注意查找的顺序!!!
  def dispatch():
      handler = getattr(self, request.method.lower())
      return handler(request, *args, **kwargs)
'''

模板语法传值

"""
django提供的模板语法只有两个符号
    {{}}:主要用于变量相关操作(引用)
    {%%}:主要用于逻辑相关操作(循环、判断)
"""
1.传值的两种方式
    # 传值方式1:指名道姓的传  适用于数据量较少的情况       节省资源
  # return render(request, 'ab_temp.html', {'name':name})
  # 传值方式2:打包传值  适用于数据量较多的情况(偷懒)     浪费资源
  '''locals() 将当前名称空间中所有的名字全部传递给html页面'''
  return render(request, 'ab_temp.html', locals())
复制代码
'''
2.传值的范围
    基本数据类型都可以
  函数名
      模板语法会自动加括号执行并将函数的返回值展示到页面上
    不支持传参(模板语法会自动忽略有参函数)
     文件名
      直接显示文件IO对象
  类名
      自动加括号实例化成对象
  对象名
      直接显示对象的地址 并且具备调用属性和方法的能力
'''
复制代码

 

posted @   *sunflower*  阅读(69)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示