get和post的区别
GET 方法
在之前的项目中创建一个 search.py 文件,用于接收用户的请求:
/HelloWorld/HelloWorld/search.py 文件代码:
# -*- coding: utf-8 -*-
from
django
.
http
import
HttpResponse
from
django
.
shortcuts
import
render_to_response
# 表单
def
search_form
(
request
)
:
return
render_to_response
(
‘
search_form.html
‘
)
# 接收请求数据
def
search
(
request
)
:
request
.
encoding
=
‘
utf-8
‘
if
‘
q
‘
in
request
.
GET
:
message
=
‘
你搜索的内容为:
‘
+
request
.
GET
[
‘
q
‘
]
else
:
message
=
‘
你提交了空表单
‘
return
HttpResponse
(
message
)
在模板目录 templates 中添加 search_form.html 表单:
/HelloWorld/templates/search_form.html 文件代码:
<
!
DOCTYPE
html
>
<
html
>
<
head
>
<
meta
charset
=
”
utf-8
”
>
<
title
>
菜鸟教程(runoob.com)
</
title
>
</
head
>
<
body
>
<
form
action
=
”
/search
”
method
=
”
get
”
>
<
input
type
=
”
text
”
name
=
”
q
”
>
<
input
type
=
”
submit
”
value
=
”
搜索
”
>
</
form
>
</
body
>
</
html
>
urls.py 规则修改为如下形式:
/HelloWorld/HelloWorld/urls.py 文件代码:
from
django
.
conf
.
urls
import
url
from
.
import
view
,
testdb
,
search
urlpatterns
=
[
url
(
r
‘
^hello$
‘
,
view
.
hello
)
,
url
(
r
‘
^testdb$
‘
,
testdb
.
testdb
)
,
url
(
r
‘
^search-form$
‘
,
search
.
search_form
)
,
url
(
r
‘
^search$
‘
,
search
.
search
)
,
]
POST 方法
上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。
提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。
我们在 templates 创建 post.html:
/HelloWorld/templates/post.html 文件代码:
<
!
DOCTYPE
html
>
<
html
>
<
head
>
<
meta
charset
=
”
utf-8
”
>
<
title
>
菜鸟教程(runoob.com)
</
title
>
</
head
>
<
body
>
<
form
action
=
”
/search-post
”
method
=
”
post
”
>
{% csrf_token %}
<
input
type
=
”
text
”
name
=
”
q
”
>
<
input
type
=
”
submit
”
value
=
”
Submit
”
>
</
form
>
<
p
>
{
{ rlt }}
</
p
>
</
body
>
</
html
>
在模板的末尾,我们增加一个 rlt 记号,为表格处理结果预留位置。
表格后面还有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。
在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:
/HelloWorld/HelloWorld/search2.py 文件代码:
# -*- coding: utf-8 -*-
from
django
.
shortcuts
import
render
from
django
.
views
.
decorators
import
csrf
# 接收POST请求数据
def
search_post
(
request
)
:
ctx
={}
if
request
.
POST
:
ctx
[
‘
rlt
‘
]
=
request
.
POST
[
‘
q
‘
]
return
render
(
request
,
”
post.html
”
,
ctx
)
urls.py 规则修改为如下形式:
/HelloWorld/HelloWorld/urls.py 文件代码:
from
django
.
conf
.
urls
import
url
from
.
import
view
,
testdb
,
search
,
search2
urlpatterns
=
[
url
(
r
‘
^hello$
‘
,
view
.
hello
)
,
url
(
r
‘
^testdb$
‘
,
testdb
.
testdb
)
,
url
(
r
‘
^search-form$
‘
,
search
.
search_form
)
,
url
(
r
‘
^search$
‘
,
search
.
search
)
,
url
(
r
‘
^search-post$
‘
,
search2
.
search_post
)
,
]