需求:假如公司只有一台服务器,开发的项目基于Django1.5的。如今却要基于Django2.0开发一套程序,且Django1.5不能卸载,必须还要安装新版本。html
这时候就须要用到虚拟环境了。前端
File-->New Project-->Django-->出现下图,如图所示进行建立。python
安装:
-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
与URL的用法相同,而且分组出来的数据也是字符串类型json
re_path('正则表达式',视图函数,参数,别名)
path是属于2.0新增的,传的路径,是准确路径windows
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
所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。to_url(self, value)
方法,和 to_python
相反,value是一个具体的Python变量值,返回其字符串,一般用于url反向引用。app
# 编写自定义转换器 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'),
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'] 表示上一个跳转页面
响应对象主要有三种形式:
#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)
向前端返回一个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是基于类的视图(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')