網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
上一章節(jié)中我們講了如何引用靜態(tài)文件和模板,以及如何使用常見(jiàn)的Django命令等。那么這章我們就來(lái)聊聊Django是如何向?yàn)g覽器發(fā)送數(shù)據(jù),以及我們?cè)趺磥?lái)接收瀏覽器返回的數(shù)據(jù)的。
請(qǐng)求
什么是request
在我們的視圖函數(shù)中,每一個(gè)函數(shù)都有一個(gè)request參數(shù),那么這個(gè)request是什么呢?request是一個(gè)對(duì)象,封裝了用戶通過(guò)瀏覽器或爬蟲(chóng)等發(fā)送過(guò)來(lái)的所有請(qǐng)求相關(guān)的數(shù)據(jù)。?注意,這里的 request 并不是 python requests模塊里面的。
GET與POST
GET與POST都是一種請(qǐng)求方式,一般我們?cè)跒g覽器輸入一個(gè)網(wǎng)址訪問(wèn)網(wǎng)站都是GET請(qǐng)求;在FORM表單中,可以通過(guò)設(shè)置Method指定提交方式為GET或者POST提交方式,其默認(rèn)是GET提交方式。它們之間最直觀的區(qū)別就是GET把參數(shù)包含在URL中;POST通過(guò)request body傳遞參數(shù),它不會(huì)作為url的一部分,不會(huì)被緩存、保存在服務(wù)器日志、以及瀏覽器瀏覽記錄中。(一個(gè)看得到,一個(gè)看不到)
?request 有一個(gè)專門用來(lái)查看用戶的請(qǐng)求方式的方法——method。現(xiàn)在就來(lái)驗(yàn)證下吧! 我以上次的test函數(shù)為例,添加?print(request.method)
語(yǔ)句, 它對(duì)應(yīng)的網(wǎng)頁(yè)路徑是/hd
那么我們點(diǎn)擊運(yùn)行后訪問(wèn) http://127.0.0.1:8000/hd/
再回到我們的pycharm就能看到訪問(wèn)網(wǎng)頁(yè)使用的請(qǐng)求方式了,果然是get請(qǐng)求
?另外,我們能夠通過(guò)request.GET獲取網(wǎng)頁(yè)上url傳遞過(guò)來(lái)的參數(shù)。怎么傳遞參數(shù)呢?在url后面輸入“ ?”,然后就能輸入?yún)?shù)了,多個(gè)參數(shù)用&連接。
?還是以剛才的 http://127.0.0.1:8000/hd/ 為例,在后面輸入?a=5&b=3變成
http://127.0.0.1:8000/hd/?a=5&b=3,最后在視圖函數(shù)test使用request.GET(GET必須大寫)方法接收,并打印結(jié)果。
?說(shuō)完GET請(qǐng)求咱們?cè)賮?lái)結(jié)合例子說(shuō)明一下POST請(qǐng)求。POST請(qǐng)求經(jīng)常出現(xiàn)在表單中,使用時(shí)需要用method指定。我們模擬一個(gè)非常簡(jiǎn)單的用戶注冊(cè)界面:當(dāng)我們輸入完用戶名和密碼后,希望用兩個(gè)變量接收它,方便以后存儲(chǔ)到數(shù)據(jù)庫(kù)。
?先制作一個(gè)簡(jiǎn)單的HTML頁(yè)面。當(dāng)我們提交表單數(shù)據(jù)后,跳轉(zhuǎn)至/save/頁(yè)面進(jìn)行保存
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用戶注冊(cè)</title> </head> <body> <h1>用戶注冊(cè)系統(tǒng)</h1> <form method="post" action="/save/"> <p>用戶名:<input type="text" name="user" value="請(qǐng)輸入用戶名"></p> 密 碼:<input type="password" name="password"></p> <p><input type="submit" value="注冊(cè)"></p> </form> </body> </html>
接著定義兩個(gè)視圖函數(shù),一個(gè)調(diào)用模板用來(lái)注冊(cè)用戶,一個(gè)用來(lái)保存用戶信息并提示注冊(cè)成功。
def login(request): return render(request, "demo.html") def save(request): user = request.POST.get("user") pwd = request.POST.get("password") print(f"用戶名:{user},密碼:{pwd}") return HttpResponse("注冊(cè)成功!")
最后再新增兩個(gè)路由
urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.login), path('save/', views.save) ]
現(xiàn)在就能開(kāi)始注冊(cè)啦!
先運(yùn)行程序,然后進(jìn)入http://127.0.0.1:8000/login/
輸入完用戶名和密碼后點(diǎn)擊注冊(cè),發(fā)現(xiàn)…被禁用了?
csrf_token
為降低安全隱患,django專門為用戶設(shè)置了一個(gè)防止跨站請(qǐng)求偽造(csrf)的功能——csrf_token。當(dāng)在表單中用post提交數(shù)據(jù)的時(shí)候,django會(huì)去檢查是否有一個(gè)csrf的隨機(jī)字符串,如果沒(méi)有就會(huì)報(bào)錯(cuò),也就是剛才出現(xiàn)的頁(yè)面。
因此,我們?cè)?strong>表單中使用post傳遞數(shù)據(jù)時(shí)需要加上{% csrf_token %}
這條命令。
我們加上這條命令后重新運(yùn)行進(jìn)入注冊(cè)網(wǎng)頁(yè),發(fā)現(xiàn)多了一串秘鑰是之前沒(méi)有的。
再次輸入用戶名與密碼,然后點(diǎn)擊注冊(cè),就能注冊(cè)成功了!接著回到pycharm也能夠看到用戶名跟密碼都打印出來(lái)了
響應(yīng)
常見(jiàn)的響應(yīng)形式一般有三種HttpResponse,render,redirect。前面兩種我們已經(jīng)使用過(guò)。
?HttpResponse可以返回簡(jiǎn)單的字符串
HttpResponse(content=響應(yīng)體, content_type=響應(yīng)體數(shù)據(jù)類型, status=狀態(tài)碼)
?render
它的作用是調(diào)用模板,并能通過(guò)字典向模板傳入數(shù)據(jù)。它有以下屬性:
- request:用于生成響應(yīng)的請(qǐng)求對(duì)象。必須要寫
- template_name: 要使用的模板的完整名稱。 也要寫
- context: 添加到模板上下文的一個(gè)字典. 默認(rèn)是一個(gè)空字典. 如果字典中的某個(gè)值是可調(diào)用的, 視圖將在渲染模板之前調(diào)用它.
- content_type: 生成的文檔要使用的MIME類型. 默認(rèn)為DEFAULT_CONTENT_TYPE設(shè)置的值. 默認(rèn)為"text/html"
- status: 響應(yīng)的狀態(tài)碼. 默認(rèn)為200
重定向
我單獨(dú)把它拎出來(lái)呢是因?yàn)榍懊嫖覀儧](méi)有講過(guò)重定向,因此我要舉個(gè)例子說(shuō)明一下。在上面的用戶注冊(cè)系統(tǒng)上稍作修改:我們注冊(cè)完用戶信息后不再提示用戶注冊(cè)成功,而是直接跳轉(zhuǎn)到登錄成功后的頁(yè)面。
在視圖函數(shù)save中將原先的 return HttpResponse(“注冊(cè)成功!”) 改為?return redirect("https://www.baidu.com")
。點(diǎn)擊運(yùn)行后再次進(jìn)入http://127.0.0.1:8000/login/
輸入完用戶名密碼點(diǎn)擊注冊(cè)后就能跳轉(zhuǎn)啦!
總結(jié)
原文鏈接:https://blog.csdn.net/lishuaigell/article/details/122877699
相關(guān)推薦
- 2022-07-13 常用類之BigDecimal、Date、Calender、SimpleDateFormat及Syst
- 2022-09-03 如何通過(guò)memberlist庫(kù)實(shí)現(xiàn)gossip管理集群及集群數(shù)據(jù)交互問(wèn)題_相關(guān)技巧
- 2024-01-27 Apache POI 及 alibaba EasyExcel使用
- 2022-11-04 SQL?Server還原完整備份和差異備份的操作過(guò)程_MsSql
- 2022-09-09 Nginx配置解決NetCore的跨域問(wèn)題_nginx
- 2023-07-04 ES聚合查詢+條件搜索的實(shí)現(xiàn)
- 2022-06-26 ASP.NET?Core中引用OpenAPI服務(wù)的添加示例_實(shí)用技巧
- 2023-11-24 局部路由守衛(wèi)path守衛(wèi)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支