一、Django中python的虚拟环境

  需求:假如公司只有一台服务器,开发的项目基于Django1.5的。现在却要基于Django2.0开发一套程序,且Django1.5不能卸载,必须还要安装新版本。

  这时候就需要用到虚拟环境了。

1、通过PyCharm创建

  File-->New Project-->Django-->出现下图,如图所示进行创建。

python django项目虚拟环境绑定 django创建虚拟环境_数据

2、通过命令创建

  安装:
           -pip3 install virtualenv
      创建虚拟环境:
           -(1)virtualenv env_django(创建虚拟环境)

           -(2)virtualenv --system-site-packages env_django(创建环境,继承原安装的模块)
      激活该虚拟环境:
           -windows进到目录里,的Script文件夹输入:activate
      退出虚拟环境:
           -deactivate
      在pycharm中使用虚拟环境
           -files--settings--Project--Project Interpreter--add选择虚拟环境路径下的python.exe即可

二、Django 2.0 和Django 1.0 路由层的区别

  唯一的区别就是1.0版本路由层使用的是URL() ,而2.0使用的是re_path和path

  re_path

  与URL的用法相同,并且分组出来的数据也是字符串类型



re_path('正则表达式',视图函数,参数,别名)



  path

  path是属于2.0新增的,传的路径,是准确路径



path('准确路径 | 转化器', 视图函数,参数,别名),
#转化器由<>包裹,包含<转化器类型:变量>,若没有转化器,将匹配任何字符串
path('test/<path:mouth>', views.re_test),

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



自定义转换器

对于一些复杂或者复用的需要,可以自定义自己的转换器。转换器是一个类或接口,它的要求有三点:

  • regex
  • to_python(self, value) 方法,value是由类属性 regex
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
# 编写自定义转换器
class MyCon:
        # 写一个正则表达式
        regex = '[0-9]{4}'
        # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
        def to_python(self, value):
        return int(value)
        # 反向解析用的
    def to_url(self, value):
        return '%04d' % value
# 注册自定义转换器
from django.urls import register_converter
register_converter(MyCon,'yyy')
# 使用自定义转换器
path('test/<yyy:year>', views.re_test,name='test'),



三、视图层

HTTPRequest对象

Django将请求报文中的请求行、首部信息、内容主体封装成 HttpResquest 类中的属性



#常用属性
# 前台Post传过来的数据,包装到POST字典中
request.POST

# 前台浏览器窗口里携带的数据,包装到GET字典中
request.GET

# 前台请求的方式
request.method

# post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1。适合处理非表单数据
request.body

# 取出请求的路径,取不到数据部分
request.path

# 取出请求的路径,能取到数据部分
request.get_full_path()

#取出表单请求方法为POST,并编写方式是enctype="multipart/form-data"的所有上传文件信息
request.FILES

#包含所有的HTTP 首部信息,以字典的形式
request.META
#注意:request.META['HTTP_REFERER']  表示上一个跳转页面



HTTPResponse对象

响应对象主要有三种形式:

  1. HttpResponse():括号内直接跟一个具体的字符串作为响应体返回
  2. render():将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
  3. redirect():重定向
render()



#render(请求对象,模板名,模板需要的参数(字典形式))
render(request, template_name[, context])

#要知道render和redircet都是HttpResponse的对象
#render的内部原理
from django.template import Template,Context
#调用Template,传入html标签
temp=Template('<h1>{{ user }}</h1>')
#调用Context,传入数据标签
con=Context({'user':'lqz'})
#二者合一
ret=temp.render(con)
#最后用HttpResponse传出去
return HttpResponse(ret)



JsonRespons对象

向前端返回一个json格式字符串



from django.http import JsonResponse
def test(request):
    dic={'name':'xgp','age':18}
    return JsonResponse(dic)

    ll = ['name', 'age']
    # 报错,默认不支持列表形式
    return JsonResponse(ll)

    # 支持列表形式
    return JsonResponse(ll,safe=False)

#JsonResponse方法内部其实是调用了json模块,在内部进行了转换
import json
dic={'name':'lqz','age':18}
# 把字典转换成json格式,返回到前台
return HttpResponse(json.dumps(dic))



四、CBV和FBV

CBV是基于类的视图(Class base view)和FBV基于函数的视图(Function base view)



from django.views import View
class AddPublish(View):
    def dispatch(self, request, *args, **kwargs):
        print(request)
        print(args)
        print(kwargs)
        # 可以写类似装饰器的东西,在前后加代码
        obj=super().dispatch(request, *args, **kwargs)
        return obj

    def get(self,request):
        return render(request,'index.html')
    def post(self,request):
        request
        return HttpResponse('post')



五、简单的文件上传

前端



<form action="" method="post" enctype="multipart/form-data">
{# <form action="" method="post" enctype="application/x-www-form-urlencoded"> #}
    <input type="file" name="myfile">
    <input type="text" name="password">
    <input type="submit" value="提交">
</form>



后台




from django.shortcuts import render, HttpResponse, redirect



def fileupload(request):
    if request.method == "GET":
        return render(request,"fileupload.html")
    if request.method == "POST":
        # 从字典种根据名字,把文件取出来
        myfile = request.FILES.get("myfile")
        name = myfile.name
        # 打开文件,把上传过来的文件保存到本地
        with open(name,"wb") as f:
            for line in myfile:
                f.wirte(line)
        return HttpResponse('ok')