Django后端的工作流程
- 用户发起http资源请求--->
- Urls.py 进行模式匹配--->
- 映射到相应的view函数逻辑---->
- 用数据渲染网页模板返回给用户,或者直接跳转到相应的网页。
Post and Get
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。
HTTP 的工作方式是基于TCP/IP,客户机与服务器之间的请求-应答协议。
HTTP包含GET, POST, PUT, DELETE等等方法。常用的就是GET,POST。
Post 和 Get在本质上是没有区别的,都是一个TCP/IP的链接。
TCP协议通过三次握手,建立端口到端口的,可靠的、基于字节流(报文段)的连接;IP通过域名解析,路由寻址,建立主机之间的交流。通过他们的配合,从而建立了HTTP的基础。
我们给GET一个定义,你的参数只能放在url中。
同样,我们给POST一个定义,你的参数(数据)放在Request body中。
那么各大浏览器就会针对不同请求做不同的处理,来提高效率。
-
POST:向指定的资源提交要被处理的数据
POST 请求不会被缓存
POST 请求不会保留在浏览器历史记录中
POST 不能被收藏为书签
POST 请求对数据长度没有要求 -
GET:从指定的资源请求数据
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
这两种方式还有一个区别,GET只发送一次请求,POST则大多数情况下(这也取决于浏览器)发送两次,一次报头,一次数据。
回到Django
- Get作为一种method,可以用于Form,也可以用于<a>的href上。
Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接。
用在Form上时,数据就会被添加在url上返回给服务器
<form class="form-inline" action="{% url 'display:search' %}" method="get">
{% csrf_token %}
<input class="form-control" type="text" placeholder="Search" name="keywords">
<button class="btn btn-success" type="submit">搜索全站</button>
</form>
用在<a>的href时,href属性值就是我们返回给服务器的url。
<div class="user-name"><a href="{% url 'display:personal_info' %}">{{ request.session.user_name}}</a></div>
这里的url就是该网页的地址栏里的地址。
如果Form不明确说明使用get 还是Post,则默认get
Attention: 只要使用了Form这个标签,就可以用request去获取参数:
name=request.GET.get('name1') # 获取参数值
否则就要通过正则表达式去解析url,得到data,将其作为函数参数传递到view的函数里。
<a class="nav-link" href="{% url 'display:category' '程序员' %}">IT</a>
url(r'^(?P<category>[\u4e00-\u9fa5]+)/$', views.category, name='category')
def category(request, category):
news = Item.objects.order_by("collect_time")
daily_news = news.order_by('collect_time').filter(category=category)[:6]
context = {
'daily_news': daily_news,
}
return render(request, 'display/category.html', context)
- Post作为一种传输数据的method,用在Form上。Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
区别:
request.POST['sth']会返回KeyError如果这里没有该参数
request.POST.get('sth')会返回None如果这里没有该参数,而且它可以添加一个默认值作为返回。
网友评论