安卓是哪個(gè)公司開發(fā)的seo優(yōu)化自動(dòng)點(diǎn)擊軟件
一)文件與文件夾
當(dāng)我們?cè)O(shè)定好一個(gè)Djiango項(xiàng)目時(shí),里面會(huì)有著view.py等文件,也就是文件的方式:
那么我們?cè)诤罄m(xù)增加app等時(shí),view.py等文件會(huì)顯得較為臃腫,當(dāng)然也根據(jù)個(gè)人習(xí)慣,這時(shí)我們可以使用文件夾的方式:
原本我的views.py中有著這些函數(shù):
現(xiàn)在我在web的app下命名一個(gè)views的文件夾并且在這個(gè)文件夾中創(chuàng)建同名的py文件:
那么使用方法其實(shí)并無(wú)特別大的改動(dòng),只是導(dǎo)入包是需要具體指定:
我們可以多個(gè)關(guān)聯(lián)的方法(def)對(duì)應(yīng)著一個(gè)py頁(yè)面就好,這種文件夾的方法我個(gè)人覺得適合用于一個(gè)app有多個(gè)復(fù)雜功能有著較多url的場(chǎng)景,這樣可以具體的指定方法,也方便我們檢查方法代碼是否有錯(cuò)誤。
二)相對(duì)與絕對(duì)導(dǎo)入
這個(gè)問題其實(shí)追求本質(zhì)就是相對(duì)路徑與絕對(duì)路徑。
相對(duì)路徑:
絕對(duì)路徑:
那么在這里我們需要注意一個(gè)點(diǎn),不可以在項(xiàng)目的根目錄做相對(duì)導(dǎo)入。
那么相對(duì)導(dǎo)入對(duì)比于絕對(duì)導(dǎo)入來(lái)說,層級(jí)會(huì)更深層次些。
原因:相對(duì)路徑比絕對(duì)路徑層級(jí)深是因?yàn)橄鄬?duì)路徑是以當(dāng)前文件為起點(diǎn),通過層級(jí)關(guān)系描述目標(biāo)文件的位置。相對(duì)路徑需要根據(jù)文件自身的位置進(jìn)行計(jì)算,所以在描述路徑時(shí)需要考慮更多的層級(jí)關(guān)系,導(dǎo)致了層級(jí)深度的增加。而絕對(duì)路徑是以根目錄為起點(diǎn),不受文件位置的限制,所以在描述路徑時(shí)相對(duì)簡(jiǎn)單,不需要考慮層級(jí)關(guān)系。
三)視圖參數(shù)
我們?cè)趧?chuàng)建方法時(shí),都會(huì)以request為默認(rèn)參數(shù),你是否真的知道request到底時(shí)個(gè)什么含義呢?
我們先來(lái)了解對(duì)象,對(duì)象我們可以理解成包裹,包裹它可以放很多東西。那么request就是一個(gè)對(duì)象,它存放了瀏覽器發(fā)送給我們的所有內(nèi)容:
- 請(qǐng)求的相關(guān)所有的數(shù)據(jù):當(dāng)前訪問的url,請(qǐng)求方式等…
- django額外添加的數(shù)據(jù)
我們可以做一個(gè)方法來(lái)具體獲取分析
from django.shortcuts import HttpResponsedef requ(request):# 1.當(dāng)前URL /api/login/print(request.path_info)# 2.URL傳遞的參數(shù)print(request.GET)print(request.GET.get("age"))# 3.請(qǐng)求方式 GET/POSTprint(request.method)# 4.如果post請(qǐng)求,傳遞請(qǐng)求體(原始數(shù)據(jù))print(request.body) # b'{"code":"083Sjmll2yla694F3bll2DguCM2SjmlG","unionId":"oP6QCsyT_9bk1dfSaVf0GEV5Y-yE"}' b'v1=123&v2=456'# 4.1 請(qǐng)求體+請(qǐng)求頭 b'v1=123&v2=456' + content-type:application/x-www-form-urlencodedprint(request.POST)print(request.POST.get("v1"))print(request.POST.get("v2"))# 4.2 請(qǐng)求體+請(qǐng)求頭 文件print(request.FILES) # 文件格式 + multipart/form-dataprint(request.FILES.get("n1"))print(request.FILES.get("n2"))# 5.請(qǐng)求頭# {'Content-Length': '', 'Content-Type': 'text/plain', 'Host': '127.0.0.1:8000', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Sec-Ch-Ua': '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"', 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Platform': '"macOS"', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7', 'Cookie': 'csrftoken=CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy'}print(request.headers)# 5.1 請(qǐng)求頭有個(gè)特殊的cookie# request.headers['cookie'] # 'csrftoken=CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy;session=xxxx'# {'csrftoken': 'CdidpKSGbLxzmOXnbmlkvrZep1eJmKLAA81T73UjcjxEnMOa4YOZqtc849AkYfUy'}print(request.COOKIES)# 6.requests中其他值print(request.resolver_match)return HttpResponse('index')
運(yùn)行后:
可以看見給我們的控制臺(tái)反饋了很全的網(wǎng)頁(yè)源碼等數(shù)據(jù)信息。
四)返回值
1.HttpResponse
格式:
HttpResponse(content=響應(yīng)體, content_type=響應(yīng)體數(shù)據(jù)類型, status=狀態(tài)碼)
響應(yīng)體必須是字符串類型,第二個(gè)參數(shù)可以指定響應(yīng)頭中的相同數(shù)據(jù),第三個(gè)數(shù)據(jù)就是可以指定狀態(tài)碼
例如:
結(jié)果:
2.JsonResponse
JsonResponse其實(shí)算是HttpReponse的一個(gè)子類,用于返回json數(shù)據(jù)(用戶端接收的數(shù)據(jù))。若要返回json數(shù)據(jù),可以使用JsonResponse來(lái)構(gòu)造響應(yīng)對(duì)象,作用是幫助我們將數(shù)據(jù)轉(zhuǎn)換為json字符串,但是需要設(shè)置響應(yīng)頭Content-Type為application/json。
參考格式:
return JsonResponse(data, encoder=DjangoJSONEncoder, safe=True,json_dumps_params=None, **kwargs):
可以如此設(shè)置:
return JsonResponse(project_data, json_dumps_params={'ensure_ascii': False}, status=301)
在這個(gè)代碼中,project_data 是作為響應(yīng)的數(shù)據(jù)傳遞給 JsonResponse 函數(shù)。json_dumps_params={‘ensure_ascii’: False} 是為了確保在序列化 JSON 數(shù)據(jù)時(shí)不使用 ASCII 編碼,以支持非 ASCII 字符。status=301 表示返回一個(gè) HTTP 301 永久重定向的狀態(tài)碼。
1、第一個(gè)參數(shù)(data)可以直接傳遞字典或者嵌套字典的列表2、默認(rèn)添加content_type為application/json3、默認(rèn)第一個(gè)參數(shù)只能為字典,如果為嵌套字典的列表,必須設(shè)置safe=False。關(guān)掉安全模式
返回嵌套列表的時(shí)候,要這樣寫:
return JsonResponse(project_data_list, safe=False)
3.redirect(重定向)
redirect可以讓我們的訪問轉(zhuǎn)移到設(shè)定上的網(wǎng)站,例如:
那么當(dāng)我在瀏覽器訪問url為red/時(shí),網(wǎng)站會(huì)自動(dòng)跳轉(zhuǎn)到百度首頁(yè)
4.渲染html頁(yè)面
格式:
render(request,"網(wǎng)址路徑")
別誤解,這個(gè)網(wǎng)址路徑是在你的項(xiàng)目里需要展示的網(wǎng)站路徑,我們需要現(xiàn)在主路由的setting.py文件中找到TEMPLATES的配置文件然后如下修改:
我們可以在每一個(gè)應(yīng)用下設(shè)定一個(gè)templates文件夾來(lái)進(jìn)行存放各自的html代碼,但是如果想要在每一個(gè)應(yīng)用下加上templates來(lái)進(jìn)行查找,需要注冊(cè)應(yīng)用,也就是在setting.py中的insetalled——apps里。
但是如果項(xiàng)目的app應(yīng)用過多,存在著templates里的文件名字一樣,會(huì)發(fā)生什么?在Django架構(gòu)中,templates的優(yōu)先級(jí)會(huì)以注冊(cè)的app的順序來(lái)。
如何解決?
我們只需要在應(yīng)用的templates目錄下創(chuàng)建一個(gè)以應(yīng)用命名的文件夾存放就可以:
一般項(xiàng)目的公共的templates里面會(huì)存放整個(gè)項(xiàng)目所需要用到的html代碼。
五)FBV CBV
- FBV,視圖用函數(shù)的形式編寫。(目前主流)
- CBV,視圖用類的形式編寫。(前后端分離的項(xiàng)目中采用的方式)
FBV例子:
admin路由是django自帶的一個(gè)后臺(tái)管理系統(tǒng),可以對(duì)model進(jìn)行基礎(chǔ)的增刪查改
urlpatterns = [path('index/', index),path("pay/", pay),path("user/", User.as_view()),
#這里的User.as_view()是返回了一個(gè)閉包內(nèi)的函數(shù),這個(gè)函數(shù)就是用FBV方法寫的函數(shù)
]
CBV例子:
from django.views import Viewclass User(View):def get(self, request):passdef post(self, request):pass
六)靜態(tài)資源
那么靜態(tài)資源其實(shí)分為兩種
- 開發(fā)需要(css、js、圖片)
- 公共文件存儲(chǔ)在根目錄的/static/下
- app所用存儲(chǔ)在app目錄下的/static/下
- 媒體文件-用戶上傳的數(shù)據(jù)(excel/pdf/video)
- 存儲(chǔ)在根目錄的 /media/
1.靜態(tài)文件
我們需要在主路由的setting.py中的最后加上如下內(nèi)容:
在django查找時(shí),其實(shí)是惰性查找,當(dāng)它查找到符合條件的第一個(gè)文件就會(huì)停止。
在多個(gè)app開發(fā)時(shí),會(huì)將各自的圖片放在各自的/static/(app名)目錄下
如何使用到?
但是在開發(fā)過程中,禁止使用如下語(yǔ)句
<img src="/static/api/1.png">
建議使用{% static %}標(biāo)簽方式:
<img src="{% static 'image/django.jpg' %">
2.媒體文件
訪問媒體文件時(shí)我們需要在路由中加上媒體文件的配置:
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
不要忘記導(dǎo)入settings的包