Django的MTV分别代表:
Model (模型): 负责业务对象与数据库的对象(ORM)
Template (模版):负责如何把页面展示给用户
View (视图): 负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
一、URL控制器
urls.py 文件
1、基本配置
url(r‘^index/‘, views.index)
url:匹配的是url的路径部分
通常会添加1个
url(r‘^$/‘, views.index),
在访问时,如果只有域名,没有路径会找到index //127.0.0.1:8080
1 一旦匹配成功则不再继续
2 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。分组
3 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
4 每个正则表达式前面的‘r‘ 是可选的但是建议加上。
2、分组
用来捕获URL 中的值
捕获的参数永远是字符串
无名分组
url(r‘^articls/(\d{4})/(\d{2})$‘, views.archive),
以位置参数传递给视图:def archive1(request,a,b):
有名分组
url(r‘^articls/(?P<y>\d{4})/(?P<m>\d{2})$‘, views.archive2),
作为关键字参数传递给视图函数:def archive2(request,y,m):
3、反向解析URL
name参数,别名
url(r‘^login/‘, views.login,name="Login"),
在template里:
<a href=‘{% url ‘Login‘ %}‘>click</a>
这样做的好处:
通常1个 r‘^login/‘ 对应很多html的很多地方
在url里修改 正则 r‘^login/‘时,不用再去修改 html里的表单等url了
4、include
当url 比较多,容易混乱时,可以用include方法来配置
from django.conf.urls import url,include
urlpatterns = [
url(r‘^app01/‘,include(‘app01.urls‘)),
]
要在app01的文件中创建urls
用户请求的url 也要是app01 开头
二、View (视图)
后端逻辑,返回响应
1、request学过的方法:
request.method --> 获取具体的请求方法:GET/POST等
request.POST.get() --> 取提交的数据里面的参数 #get("key",1)取key值,如果没有则取到1
request.POST.getlist() --> 提交的是列表的数据类型
request.GET.get("key") --> 取URL里面的参数
request.GET.getlist("key") --> 取值,值为列表
request.COOKIES.get("key") --> 获取具体的cookie值
request.session
request.get_full_path() --> 获取请求的URL(包括后边的?)
request.path_info -->取到要访问目录的,"/index/",不包括后边的?参数等
request.path -->同path_info
request.body -->字节串,表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
request.is_ajax() -->判断是不是ajax请求
request.FILES --->类似于字典的对象,包含所有的上传文件信息。
#注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。
2、新手三件套
from django.shortcuts import HttpResponse
# 直接返回字符串内容时,用return HttpResponse("字符串")
from django.shortcuts import render
#渲染
返回html的文件时,return render(request,"login.html",)
传参时:return render(request,"login.html",{"user_lst":变量名})
from django.shortcuts import redirect
#重定向 return redirect("http://www.oldboyedu.com";) 可以绝对或相对
render 渲染
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
是在返回前就已经渲染完毕了
render(request, ‘xx.html‘,locals()) #把当前函数里的所有局部变量都传进去
#本质是:
t=Template("<html><body>当前时刻:{{current_date}}</body></html>")
c=Context({"current_date":c})
html=t.render(c)
return HttpResponse(html)
redirect 重定向到某个路径
两次请求过程
可以在浏览器的控制窗口Network 看到两次请求的过程
render 和 redirect的区别
登录时,经历的过程:
第一次请求:
请求url: http://127.0.0.1:8000/login.html/ GET 无请求数据
login.html/-------> views.login------>login()
响应到一个login.html页面
第二次请求:
请求url: http://127.0.0.1:8000/login.html/ POST 有请求数据 {"user":"alex","pwd":"123"}
login.html/-------> views.login------>login()
响应的return redirect("/index/")到浏览器,通知浏览器再发送请求:"/index/"
第三次请求:
请求url: http://127.0.0.1:8000/index/ get请求 没有数据
index/ --->url(r‘^index/‘, views.index),---->index()
响应一个index.html