Django 고급 보기

12482 단어 Django
Django 제한 요청 method
제한 요청 장식기
  • 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'])의 약자 형식에 해당하고 GETmethod로만 보기에 접근할 수 있다.예제 코드는 다음과 같습니다.
  • from django.views.decorators.http import require_GET
    
    @require_GET
    def my_view(request):
        pass
    
  • django.views.decorators.http import require_POST: 이 장식기는 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
    

    방향을 바꾸다
  • 영구 리디렉션: http의 상태 코드는 301로 오래된 사이트가 폐기되어 한 성으로 넘어가야 하는 사이트에서 사용자의 방문을 확보하는 데 많이 사용된다
  • 일시적 리셋: http의 상태 코드는 302로 페이지의 일시적인 이동을 나타낸다.예를 들어 권한이 필요한 사이트를 방문하면 사용자가 로그인하지 않으면 로그인 페이지로 다시 지정해야 한다. 이런 경우 일시적으로 다시 지정해야 한다.

  • 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 객체
  • is_secure ():https 프로토콜을 사용할지 여부입니다.
  • is_ajax (): aax에서 보낸 요청을 사용할지 여부입니다.원리는 요청 헤더에 X-Requested-With:XMLHttpRequest가 존재하는지 판단하는 것이다.
  • get_host(): 서버의 도메인 이름입니다.만약 방문할 때 포트 번호가 있다면, 상단 구호를 붙일 것이다.예를 들면 www.baidu.com:9000.
  • get_full_path (): 전체 path를 되돌려줍니다.검색 문자열이 있으면 검색 문자열도 추가됩니다.예를 들면/music/bands/?print=True.
  • get_raw_uri (): 요청한 전체 URL을 가져옵니다.

  • QueryDict 객체:
  • get 방법: 지정한 키의 값을 가져오는 데 사용되며, 이 키가 없으면 None으로 되돌아옵니다.
  • getlist 방법: 브라우저에 올라온 키에 대응하는 값이 여러 개 있다면 이 방법을 통해 얻을 수 있습니다.

  • HttpResponse 객체
    공통 속성
  • content: 반환 내용
  • status_code: 되돌아오는 http 응답 상태 코드
  • content_type: 반환된 데이터의 MIME 형식, 기본값text/htm
  • 응답 헤드 설정: 사전을 설정하는 방식으로 응답 헤드를 설정할 수 있다. 예를 들어 우리는 csrftoken과 관련된 검증 정보를 응답 헤드에 설정할 수 있다.'X-Access-Token'='xxxxx'. 우리도response가 csv 또는 Excel 파일을 생성할 때 해당하는 응답 헤드를 설정하여 생성된 파일 정보를 설명할 수 있다.'response['Content-Disposition'] ='attachment.filename=“abc.xls”’

  • 상용 방법
  • set_쿠키: 쿠키 정보를 설정합니다.
  • delete_쿠키: 쿠키 정보를 삭제합니다.
  • write: HttpResoponse는 파일과 유사한 대상으로 데이터체(content)에 데이터를 쓸 수 있다
  • 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'),
        ]
    
  • 뷰에 정의된 메서드가 없는 경우예를 들어 당신의 클래스 보기는 get 방법만 지원하고post 방법이 나타나면 이 요청을 http 에 전송합니다method_not_allowed(request,*args,**kwargs).

  • 예:
    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
  • django.view.generic.base.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
  • 빠른 개발 목록은 Django에서 사용 가능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 Paginatorfrom django.core.paginator import Page이다.
    Paginator
  • count: 총 데이터 수
  • num_pages: 총 페이지 수
  • page_range: 페이지의 구간.예를 들어 3페이지가 있으면range(1,4)
  • Page
  • has_next: 다음 페이지가 있는지 여부
  • has_previous: 이전 페이지가 있는지 여부
  • next_page_number: 다음 페이지의 페이지 번호
  • previous_page_number: 이전 페이지의 페이지 번호
  • number: 현재 페이지
  • start_index: 현재 이 페이지의 첫 번째 데이터의 인덱스 값
  • end_index: 현재 이 페이지의 마지막 데이터의 인덱스 값
  • 클래스 보기에 장식기 추가
    때때로 일부 보기에 장식기를 추가해야 한다.함수 보기가 그렇게 간단하다면 함수 위에 장식기만 쓰면 된다.그러나 클래스에 장식기를 추가하려면 다음과 같은 두 가지 방안을 통해 실현할 수 있다
    디스플레이 장식 방법:
    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: 서버에 지정된 URL이 없습니다.
  • 403: 관련 데이터에 액세스할 권한이 없습니다.
  • 405: 요청한 method 오류입니다.
  • 400:bad request, 요청한 매개 변수 오류입니다.
  • 500: 서버 내부 오류입니다. 코드에 버그가 발생했습니다.
  • 502: 일반적으로 배치할 때 많이 보입니다. 보통nginx가 시작되고 uwsgi에 문제가 있습니다.

  • 오류 처리 솔루션
    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)
    

    좋은 웹페이지 즐겨찾기