一、虚拟环境

1用pychanrm创建--->files-->newproject--->选择虚拟环境2settings-->project创建3用命令行创建,详见https://www.cnblogs.com/liuqingzheng/p/9508851.html

二、django 2.0和django 1.0 路由层区别

(*****url,re_path分组分出来的数据,是字符串)-re_path:跟1.0的url用法相同-path:传的路径,是准确路径-re_path---->等于原来的url(re_path模块)5个转换器-->path('test/<path:year>',views.re_test),str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式int,匹配正整数,包含0。slug,匹配字母、数字以及横杠、下划线组成的字符串。uuid,匹配格式化的uuid,如075194d3-6885-417e-a8a8-6c931e272f00。path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

-自定义转换器(django2.0)

print('%010d'%12)#结果:0000000012(共10位,不足的用0补齐)

urls.py

#1、定义一个类:#自定义转换器classMyCon:#写一个正则表达式,名字必须命名为regexregex='[0-9]{4}'#匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收defto_python(self,value):returnint(value)#×××#returnvalue#字符串类型#反向解析用的defto_url(self,value):return"%04d"%value#2导入模块fromdjango.urlsimportregister_converter#转换器register_converterregister_converter(MyCon,'yyy')#3写入表达式urlpatterns=[path('test/<yyy:year>',views.re_test),]

views.py

defre_test(request,year):returnHttpResponse('ok')

访问:http://127.0.0.1:8000/test/2018

返回:ok


urls.py

fromdjango.urlsimportpath,re_path,register_converterfromapp01importviewsclassMyCon:regex='[0-9]{4}'defto_python(self,value):returnvaluedefto_url(self,value):return"%04d"%valueregister_converter(MyCon,'yyy')urlpatterns=[path('test/<yyy:year>',views.re_test,name='test'),]

views.py

fromdjango.shortcutsimportrender,HttpResponse,reversedefre_test(request,year):url=reverse('test',args=(9,))print(url)returnHttpResponse('ok')

返回:/test/0009

三、APPEND_SLASH

settings.py

#默认为True,设置为False后http://127.0.0.1:8000/test不会为test补全后面的'/',打开网页后会成为404(若没有这个页面的话)APPEND_SLASH=False

四、视图层之http request对像

#request属性#https://www.cnblogs.com/liuqingzheng/articles/9509801.html#deftest(request):#print(type(request))#前台Post传过来的数据,包装到POST字典中#request.POST#前台浏览器窗口里携带的数据,包装到GET字典中#request.GET#前台请求的方式#request.method#post提交的数据,都存放在body体的内容#request.body#取出请求的路径,取不到数据部分#print(request.path)#取出请求的路径,能取到数据部分#print(request.get_full_path())#请求头里的数据(例如:请求地址,名字,以及从哪个地址访问过来的)#print(request.META)#referer:是从哪个链接过来的#post提交数据格式,放到body体中#name=lqz&age=18&sex=1#returnHttpResponse("ok")

小点补充:调试断点:

五、视图层之HttpResponse

三件套:render,HttpResponse,redirect

# render(返回模板,html文件)

# HttpResponse:返回字符串

# redirect: 重定向

HttpResponse内部原理

views.py

fromdjango.shortcutsimportrender,HttpResponsefromdjango.templateimportTemplate,Contextdefindex(request):ifrequest.method=="GET":temp=Template('<h2>{{user}}</h2>')con=Context({'user':'s_jun'})ret=temp.render(con)print(ret)returnHttpResponse(ret)

urls.py

url(r'^index/',views.index)

六、视图层之JsonResponse对象

#返回给前台的一个json格式,可以让js代码拿到,实现dom操作,这种叫做前后端分离。

#使用 JsonResponse返回给前台一个json格式的字典,只支持字典,另外一种方式可以支持列表

views.py

fromdjango.httpimportJsonResponsedefindex(request):importjsondic={'name':'s_jun','age':20}#returnHttpResponse(json.dumps(dic))#原理returnJsonResponse(dic)

支持列表的方式:views.py

defindex(request):li=['name','age']returnJsonResponse(li,safe=False)

访问:http://127.0.0.1:8000/index/

七、fbv与cbv

-基于类的视图

urls.py

url(r'^test/',views.Test.as_view()),#自定义Test类,调用as_view的方法,叫做:绑定给类的方法

views.py

fromdjango.viewsimportViewclassTest(View):defget(self,request):#一定要传request对象returnHttpResponse('Thisisget-test')defpost(self,request):returnHttpResponse('Thisispost-test')

-基于函数的视图

八、文件上传

urls.py

url('^upload/',views.upload)

#需要在根项目下创建一个img的目录

views.py

defupload(request):ifrequest.method=='GET':returnrender(request,'upload.html')ifrequest.method=="POST":myfile=request.FILES.get('yyy')img="img/"+myfile.name#打开文件,把上传过来的文件存到本地withopen(img,'wb')asf:forlineinmyfile.chunks():f.write(line)returnHttpResponse('postok')

upload.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>upload</title></head><body><formaction=""method="post"enctype="multipart/form-data"><inputtype="file"name="yyy"><p>密码:<inputtype="password"name="password"></p><inputtype="submit"value="提交"></form></body></html>

补充:*****编码方式multipart/form-data或者:application/x-www-form-urlencoded传的数据,都可以从POST中取出来