3. Post and Get

2018-05-04  本文已影响0人  何大炮

Django后端的工作流程

  1. 用户发起http资源请求--->
  2. Urls.py 进行模式匹配--->
  3. 映射到相应的view函数逻辑---->
  4. 用数据渲染网页模板返回给用户,或者直接跳转到相应的网页。

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中。
那么各大浏览器就会针对不同请求做不同的处理,来提高效率。

  1. POST:向指定的资源提交要被处理的数据
    POST 请求不会被缓存
    POST 请求不会保留在浏览器历史记录中
    POST 不能被收藏为书签
    POST 请求对数据长度没有要求

  2. GET:从指定的资源请求数据
    GET 请求可被缓存
    GET 请求保留在浏览器历史记录中
    GET 请求可被收藏为书签
    GET 请求不应在处理敏感数据时使用
    GET 请求有长度限制
    GET 请求只应当用于取回数据

这两种方式还有一个区别,GET只发送一次请求,POST则大多数情况下(这也取决于浏览器)发送两次,一次报头,一次数据。

回到Django

  1. 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)
  1. Post作为一种传输数据的method,用在Form上。Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
    区别:
    request.POST['sth']会返回KeyError如果这里没有该参数
    request.POST.get('sth')会返回None如果这里没有该参数,而且它可以添加一个默认值作为返回。
上一篇下一篇

猜你喜欢

热点阅读