一、虚拟环境
对于一些需要跑在不同版本的模块下的项目,可以跑在虚拟环境中运行
创建虚拟环境的两种方法
pychanrm**创建
1.创建项目时选择使用虚拟环境
2.在已创建的项目中设置setting
注:纯净环境就是没有任何模块
命令行创建
1.下载virtualenv软件
pip3 install virtualenv
2.创建虚拟环境
#创建纯净环境
virtualenv env_django
#创建环境,继承了原安装的模块
virtualenv --system-site-packages env_django
3.激活虚拟环境
#通过命令行,进入虚拟环境的文件夹下的Script文件,输入
active
4.退出虚拟环境
deactivate
二、Django2.0与Django1.0的路由区别
唯一的区别就是1.0版本路由使用的是URL(),而2.0的是re_path和path
re_path
与url的用法一模一样,并且分组出来的数据也是字符串类型
re_path('正则表达式',视图函数,参数,别名)
path
这是2.0新增的,传过来的路径是准确路径,而不是正则表达式
path('准确路径 | 转化器', 视图函数,参数,别名),
#转化器由<>包裹,包含<转化器类型:变量>,若没有转化器,将匹配任何字符串
path('test/<path:year>', 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反向引用。
#编写自定义转化器
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将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。
#常用属性
# 前台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对象
响应对象主要有三种形式:
- HttpResponse():括号内直接跟一个具体的字符串作为响应体返回
- render():将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
- 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)
JsonResponse对象
向前端返回一个json格式字符串
from django.http import JsonResponse
def test(request):
dic={'name':'lqz','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)
#路由层:
url(r'^test/', views.Test.as_view()),
#视图层
from django.views import View
class Test(View):
def get(self, request):#一定要传request对象
return HttpResponse('get-test')
def post(self, request):
return HttpResponse('post-test')
FBV:基于函数的视图(Function base view)
七、简单文件上传
前端:
#enctype属性
#application/x-www-form-urlencoded:默认,POST会拿到控件传过来的值,除了文件,只会获得文件的名字;FILES也没获得文件
#multipart/form-data:POST拿不到文件信息,会将文件信息与数据存放到FILES中;如果没上传文件就提交,POST会得到文件的字典形式,value为空
#text/plain:不会拿到表单信息
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="text" name="password">
<input type="submit" value="提交">
</form>
后台:
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.chunks():
for line in myfile:
f.write(line)
return HttpResponse('ok')