Суроғаҳо ва view
Чаро суроғаҳо ва view лозиманд
Вақте меҳмон каталоги осорхонаро мекушояд, сервер бояд муайян кунад, ки ба ӯ саҳифаи асосӣ, нигора ё маълумоти ҷустуҷӯ лозим аст. Django суроғаро бо функсияи Python мепайвандад ва натиҷаи онро ба ҷавоби HTTP табдил медиҳад. Дар ин курс ҳамин механизмҳо асоси блоги дорои шарҳҳо мешаванд.
Дархости HTTP метод (GET, POST), роҳ ва маълумоти иловагӣ дорад. Ҷавоб рамзи ҳолат, сарлавҳаҳо ва бадан дорад. Рамзи 200 муваффақият, 400 маълумоти нодурусти дархост ва 404 ёфт нашудани захираро мефаҳмонад. Матни ҷавоб ва рамзи он қисмҳои ҷудоанд: навиштани «ёфт нашуд» худ аз худ ҷавобро ба хато табдил намедиҳад.
Танзимот ва ҷавоби аввал
Дар лоиҳаи калон танзимот, суроғаҳо ва view дар файлҳои ҷудо ҷойгиранд. Мо як файлро истифода мебарем, то тамоми роҳи дархост намоён бошад. settings.configure танзимотро як бор муайян мекунад; django.setup() Django ва феҳристи барномаҳоро оғоз мекунад. Моделҳоро баъди ин оғозкунӣ таъриф кунед.
ROOT_URLCONF модули дорои urlpatterns-ро нишон медиҳад; __name__ модули ҷориро мефаҳмонад. Ин SECRET_KEY таълимӣ аст ва ALLOWED_HOSTS номи сервери санҷиширо иҷозат медиҳад. DEBUG=True ҳангоми таҳия ёрӣ медиҳад. Ин қиматҳои таълимӣ танзимоти сервери оммавӣ нестанд.
Мисолҳои зерро бо тартиб дар як файли нав иҷро кунед. Client дар дохили Python дархост мефиристад: барои санҷиш оғоз кардани сервер лозим нест.
import django
from django.conf import settings
settings.configure(
DEBUG=True, SECRET_KEY="learning", ALLOWED_HOSTS=["testserver"],
ROOT_URLCONF=__name__,
)
django.setup()
from django.http import HttpResponse, JsonResponse, Http404
from django.urls import path, reverse
from django.test import Client
def home(request):
return HttpResponse("Осорхона")
urlpatterns = [path("", home, name="home")]
client = Client()
r = client.get("/")
print(r.status_code, r.content.decode())
print(r["Content-Type"])
Натиҷа:
200 Осорхона
text/html; charset=utf-8
Қисми тағйирёбандаи суроға
View функсияест, ки аргументи аввалаш request буда, объекти ҷавобро бармегардонад. Конвертер дар path қисми роҳро пеш аз даъвати функсия месанҷад. <int:number> ададҳои бутуни ғайриманфиро қабул карда, number-ро ҳамчун int медиҳад; <str:name> порчаи ғайрихолии бе /-ро мегирад. Конвертери slug ҳарфҳои лотинӣ, рақамҳо, _ ва --ро қабул мекунад; path инчунин хатҳои моилро қабул мекунад.
Қолиби роҳро бе / дар аввал менависанд. / дар охир қисми қолиб аст. Дар мисол ба рӯйхати мавҷуда масири нав илова мекунем.
def room(request, number):
return HttpResponse(f"{number} {type(number).__name__}")
urlpatterns.append(path("rooms/<int:number>/", room, name="room"))
print(client.get("/rooms/04/").content.decode())
print(client.get("/rooms/x/").status_code)
print(reverse("room", kwargs={"number": 8}))
Натиҷа:
4 int
404
/rooms/8/
Маълумоти дархост ва JSON
Қисми пас аз ? дар интихоби масир иштирок намекунад. Он ба request.GET медарояд, ки ба луғат монанд аст. .get("name", "") ҳангоми набудани параметр қимати эҳтиётӣ медиҳад. request.method методи дархост ва request.POST майдонҳои формаи фиристодашударо нигоҳ медорад.
JsonResponse луғатро сериализатсия карда, навъи муҳтавои JSON-ро мегузорад. ensure_ascii=False ҳарфҳои Unicode-ро хонданбоб нигоҳ медорад. Дар ин мисол танҳо номро бармегардонем: ҷустуҷӯ ва филтркунӣ иҷро намешаванд.
def greeting(request):
name = request.GET.get("name", "").strip()
if not name:
return JsonResponse({"error": "Ном лозим аст"}, status=400,
json_dumps_params={"ensure_ascii": False})
return JsonResponse({"message": f"Салом, {name}!"},
json_dumps_params={"ensure_ascii": False})
urlpatterns.append(path("hello/", greeting))
r = client.get("/hello/", {"name": " Ada "})
print(r.status_code, r.content.decode())
print(client.get("/hello/").status_code)
Натиҷа:
200 {"message": "Салом, Ada!"}
400
Захираи мавҷуднабуда
Масир метавонад мавҷуд бошад, вале объекти муайян набошад. Http404 истисност: онро бояд барангехт, на баргардонд. Django онро ҳангоми коркарди дархост гирифта, ҷавоби 404 месозад. Ин мисоли кӯтоҳ масир, луғат ва санҷиши мавҷудиятро дар каталоги ҷудогонаи осорхона муттаҳид мекунад.
EXHIBITS = {6: "Сафолгарӣ"}
def exhibit(request, number):
if number not in EXHIBITS:
raise Http404("Нигора ёфт нашуд")
return HttpResponse(EXHIBITS[number])
urlpatterns.append(path("exhibits/<int:number>/", exhibit))
r = client.get("/exhibits/6/")
print(r.status_code, r.content.decode())
print(client.get("/exhibits/9/").status_code)
Натиҷа:
200 Сафолгарӣ
404
Тарзи кори дохилӣ
Мизи маълумотро тасаввур кунед: роҳ саволи меҳмон, urlpatterns феҳристи шуъбаҳо, view корманди шуъбаи зарурӣ ва ҷавоб маълумотномаи додашуда аст. Django масирҳоро аз боло ба поён мехонад, мувофиқати аввалро интихоб мекунад, аргументҳоро бо конвертерҳо табдил медиҳад ва функсияро даъват мекунад. Функсия ҷавоб месозад; Http404 ин равандро ба коркарди хато мегузаронад.
Масири умумӣ метавонад суроғаи барои масири махсус пешбинишударо гирад: <slug:code> сатри 42-ро ҳам қабул мекунад. Аз ин рӯ тартибро бо суроғаҳои мушаххас санҷед. reverse вазифаи баръаксро иҷро мекунад: аз номи масир роҳ месозад. Ин ном шарт нест бо номи функсия яксон бошад.
Мизоҷи санҷишӣ коркардкунандаи Django-ро дар дохили раванд истифода мебарад. Дар масъалаҳо тугмаи иҷро серверро бо runserver --noreload оғоз мекунад, вале санҷиш тавассути Client мегузарад. Иловаи худкори / ба CommonMiddleware ва танзимоти мувофиқ ниёз дорад; дар танзимоти ҳадди ақали курс он нест.
Хатоҳои маъмул ва ислоҳҳо
path("/rooms/", home)дар аввал/-и зиёдатӣ дорад: дархости одӣ мувофиқ намеояд. Ислоҳ:path("rooms/", home).def home(): ...дархостро қабул намекунад: Django аргумент дода,TypeErrorба вуҷуд меояд.request-ро параметри аввал кунед.return "Осорхона"ба ҷойи ҷавоб сатр медиҳад: коркардкунанда онро ҳамчунHttpResponseистифода бурда наметавонад.return HttpResponse("Осорхона")нависед.return Http404()истисноро ҳамчун қимат бармегардонад.raise Http404()лозим аст, то мизоҷ 404 гирад.request.GET["name"]ҳангоми набудани майдонMultiValueDictKeyErrorмедиҳад. Агар набудан иҷозат бошад,.get("name", "")-ро истифода бурда, қимати холиро алоҳида санҷед.
Ёддошт
| Вазифа | Восита |
|---|---|
| Оғозкунӣ | settings.configure(...), сипас django.setup() |
| Пайвастани роҳ ва функсия | path("rooms/<int:number>/", room, name="room") |
| Хондани параметр | request.GET.get("name", "") |
| Матн ё JSON | HttpResponse(...), JsonResponse({...}) |
| Захира ёфт нашуд | raise Http404() |
| Пайванд аз рӯйи ном | reverse("room", kwargs={"number": 8}) |
| Санҷиш бе сервер | Client().get("/...") |