Django 고급 보기
12482 단어 Django
제한 요청 장식기
django.views.decorators.http import require_http_methods
: 이 장식기는 접근을 허용하는 방법의 목록을 전달해야 합니다.예를 들어 GET
로만 접근할 수 있다면 예시 코드: from django.views.decorators.http import require_http_methods
@require_http_methods
def my_view(request):
pass
django.view.decorators.http.require_GET
: 이 장식기는 require_http_methods(['GET'])
의 약자 형식에 해당하고 GET
의method
로만 보기에 접근할 수 있다.예제 코드는 다음과 같습니다. from django.views.decorators.http import require_GET
@require_GET
def my_view(request):
pass
post
로만 접근할 수 있습니다. method
보기 예시 코드는 다음과 같습니다. from django.views.decorators.http import require_POST
@require_POST
def my_view(request):
pass
django.views.decorators.http.require_safe
: 이 장식기는 require_http_methods(['GET','HEAD'])
의 약자 형식에 해당하며 상대적으로 안전한 방식으로만 보기에 접근할 수 있다.GET와 HEAD는 서버에 대해 추가적인 수정 작업을 수행하지 않기 때문입니다.따라서 상대적으로 안전한 요청 방식이다.예제 코드는 다음과 같습니다. from django.views.decorators.http import require_safe
@require_safe
def my_view(request):
pass
방향을 바꾸다
Django에서 방향을 바꾸는 것은
redirect(to,*args,permanent=False, **kwargs)
로 이루어진다.to
는 URL이고 permanent
는 리셋이 영구적인 리셋인지 여부를 나타낸다. 기본값false
은 리셋에 대한 사용이다.from django.shortcuts import reverse,redirect
def profile(request):
if requst.GET.get("username"):
return HttpResponse("%s, !")
else:
return redrect(reverse("urer:login"))
HttpRequest 객체
WSGIRequest 객체
QueryDict 객체:
get
방법: 지정한 키의 값을 가져오는 데 사용되며, 이 키가 없으면 None으로 되돌아옵니다.getlist
방법: 브라우저에 올라온 키에 대응하는 값이 여러 개 있다면 이 방법을 통해 얻을 수 있습니다.HttpResponse 객체
공통 속성
text/htm
상용 방법
def index(request):
response = HttpResponse(' ', content_type="text/plain; charset=utf-8") # content_type
response.status_code = 400 #
response['password'] = 'zhishao' #
response.write('alsd')
return response
JsonResponse 클래스
dump
에서 json 문자열을 만들고 json 문자열을response 대상으로 봉하여 브라우저에 되돌려줍니다.그리고 그것의 contentype은 application/json
입니다.
def jsonresponse(request):
person = {
'username': 'zhiliao',
'age': 18,
'height': 180
}
# JsonResponse
# person_str = json.dumps(person)
# response = HttpResponse(person_str, content_type='application/json')
# return response
# JsonResponse
response = JsonResponse(person)
return response
# sonResponse dump, JsonResponse, `safe=False` 。
person = [1,2,3,4,5]
return HttpResponse(person, safe=false)
csv 파일 생성
def csv1(request):
response = HttpResponse(content_type='text_csv')
#
response['Content-Disposition'] = "attacgment;filename = 'abc.csv'"
writer = csv.writer(response) # writer response
writer.writerow(['username', 'age'])
writer.writerow(['zhiliao', 18])
return response
def template_csv(request):
response = HttpResponse(content_type='text/csv')
#
response['Content-Disposition'] = "attachment;filename ='abc.csv'"
context = {
'rows': [
['username', 'age'],
['zhiliao', 18],
]
}
template = loader.get_template('abc.txt')
csv_template = template.render(context)
response.content = csv_template
return response
클래스 보기
보기를 쓸 때 Django는 함수를 보기로 하는 것 외에 클래스를 보기로 사용할 수 있습니다.클래스 보기를 사용하면 클래스의 일부 특성, 예를 들어 계승 등을 사용할 수 있다.
View:
from django.views.generic.base import View
는 주요한 유형시도이고 모든 유형시도는 그의 기초이다.자신의 클래스 보기를 쓰면 계승할 수도 있다.그리고 현재 요청한 method
에 따라 다른 방법을 실현한다.예를 들어 이 보기는 get 방식으로만 요청할 수 있으며, 이 클래스에서 get(self,request,*args,**kwargs)
방법을 정의할 수 있습니다.이런 식으로 추론하면 실현post
방법만 있으면 클래스에서 실현post(self,request,*args,**kwargs)
할 수 있다. 예시 코드는 다음과 같다. class DefineClassview(View):
""" """
def get(self, request,*args,**kwargs):
""" GET """
return HttpResponse('GET ')
def post(self, request,*args,**kwargs):
""" POST """
return HttpResponse('POST ')
def put(self, request):
pass
라우트를 구성할 때 클래스 뷰를 사용하는 asview () l에서 추가를 등록하려면 다음과 같이 하십시오.
urlpatterns = [
# :
# url(r'^register/$', views.register, name='register'),
# : as_view() ,
url(r'^register/$', views.RegisterView.as_view(), name='register'),
]
예:
class BookDetaialView(View):
def post(self,request,book_id):
return HttpResponse(' id :{}'.format(book_id))
def http_method_not_allowed(self, request, *args, **kwargs):
return HttpResponse(' %s , POST !'%request.method)
그리고 urls에 맵 추가:
path('detaial/',views.BookDetaialView.as_view()),
우리가 웹 주소를 입력하여 접근할 때 문자열을 되돌려줍니다: GET , POST !
사실 get 요청이든post 요청이든django.views.generic.base.dispatch(request, *args, **kwargs) 방법입니다. 따라서 이 방법을 실현하면 모든 요청을 처리할 수 있습니다.TemplateView
template_name
입니다. 이 속성은 템플릿을 저장하는 경로이고 templateView
는 이 변수가 가리키는 템플릿을 자동으로 렌더링합니다.또 하나는 get_context_data
인데 이 방법은 상하문 데이터를 되돌려 주는 데 쓰인다. 즉, 템플릿에 전달되는 매개 변수이다.예제 코드는 다음과 같습니다. from django.views.generic.base import TemplateView
class HomePageView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs)
context = super().get_context_data(**kwargs)
context["username"] = " "
return context
urls.py
의 매핑 코드는 다음과 같습니다.from django.urls import path
from myapp.views import HomePageView
urlpatterns = [
path('', HomePageView.as_view())
]
템플릿에 매개 변수를 전달할 필요가 없다면
urls.py
에서만 TemplateView
를 사용하여 템플릿을 렌더링할 수 있습니다.예제 코드는 다음과 같습니다.from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('', TemplateView.as_view(template_name=" "))
]
ListView
ListView
class articleListview(ListView): # ListView
model = Atricle # model ,
template_name = 'atrophy.html' #
context_object_name = 'articles' #
paginate_by = 10 #
ordering = 'creat_time' #
page_kwarg = 'p' # 。 page
def get_context_data(self, **kwargs):
""" """
context = super(articleListview, self).get_context_data(*kwargs) # articListview
context['username'] = "zhiliao"
print(context)
return context
def get_queryset(self):
""" , , 。 。"""
return Atricle.objects.filter(id__lt=9)
Paginator 및 Page 클래스
Paginator Page
와 Page
류는 모두 페이지를 나누는 데 사용되며, Django의 경로는 from django.core.paginator import Paginator
와 from django.core.paginator import Page
이다.Paginator
count
: 총 데이터 수num_pages
: 총 페이지 수page_range
: 페이지의 구간.예를 들어 3페이지가 있으면range(1,4)때때로 일부 보기에 장식기를 추가해야 한다.함수 보기가 그렇게 간단하다면 함수 위에 장식기만 쓰면 된다.그러나 클래스에 장식기를 추가하려면 다음과 같은 두 가지 방안을 통해 실현할 수 있다
디스플레이 장식 방법:
from django.utils.decorators import method_decorator
def login_required(func):
def wrapper(request,*args,**kwargs):
if request.GET.get("username"):
return func(request,*args,**kwargs)
else:
return redirect(reverse('index'))
return wrapper
class IndexView(View)
def get(self, request, *args, **kwargs):
return HttpResponse("index")
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
super(IndexView,self).dispatch(request, *args, **kwargs)
전체 클래스에 직접 장식
from django.utils.decorators import method_decorator
def login_required(func):
def wrapper(request,*args,**kwargs):
if request.GET.get("username"):
return func(request,*args,**kwargs)
else:
return redirect(reverse('login'))
return wrapper
@method_decorator(login_required,name='dispatch')
class IndexView(View):
def get(self,request,*args,**kwargs):
return HttpResponse("index")
def dispatch(self, request, *args, **kwargs):
super(IndexView, self).dispatch(request,*args,**kwargs)
오류 처리
일반적인 오류 코드
오류 처리 솔루션
404와 500 같은 자동 투매 오류에 대해우리는templates 폴더 아래에 해당하는 오류 코드의 템플릿 파일을 직접 만들 수 있습니다.다른 오류에 대해서는 이 오류를 처리하기 위한 앱을 정의할 수 있습니다.
def view_403(request):
return render(request, 'errors/403.html',status=403)
def view_403(request):
return render(request, 'errors/500.html',status=500)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.