ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 장고 Views를 활용한 HTTP 요청 처리
    카테고리 없음 2021. 10. 22. 13:15

    <다양한 응답의 함수 기반 뷰>

    View: 1개의 HTTP 요청에 대해 호출되는 1개의 함수(호출 가능한 객체)

    크게 2가지 형태의 뷰 

    - 함수 기반 뷰 (Function Based View) : 장고 뷰의 기본. 

    - 클래스 기반 뷰 (Class Based View) : Class.as_view()를 통해 호출가능한 객체를 생성/리턴

     

    View 호출 시, 인자 

    1번째 인자: HttpRequest 객체

    2번째 ~ 인자: 현재 요청의 URL로부터 Capture된 문자열들 

     

    View호출에 대한 리턴값은 필히 HttpResponse 객체를 리턴해야 한다! => request: input, Response : output

    예시) localhost:8000/instagram/1/ 일때 호출 가능

    def post_detail(request,pk):
       response = HttpResponse()
       response.write('Hello World')
       return response

     

    <URL Dispatcher 와 정규표현식 >

    <프로젝트명> / settings.py / 의

    ROOT_URLCONF = 'askcompany.urls'

    가 모든 urls의 시작점이 된다. 여기서 ulrs.py에 path를 통해 트리구조를 이어나가면 된다. 

    ## 매칭되는 URL Rule이 여러개 존재한다면, url_patterns list에 처음 적용되는 rule만 적용한다.

    ## 매칭되는 URL Rule이 없을 경우, 404 Page Not Found 응답을 발생 

     

    django.urls.re_path() == django.urls.path() : 두개가 동일. 정규표현식 path

     

    <기본제공되는 Path Converters>

    - IntConverter: 

    - StringConverter

    - UUIDConverter

    - SlugConverter

    - PathConverter

     

    <다양한 정규표현식 예시>

    1자리: r"\d"

    4자리: r"\d{4}"

    휴대폰번호: r"010[1-9]\d{7}"

     

     

    새로운 장고 앱을 생성할 때, 순서 작업(항상 쓰는거니 중요)

    1. 앱 생성

    2. 앱이름 / 앱 내의 urls.py 파일 생성

    3. 프로젝트 내의 urls.py에 include 적용 

    4. 프로젝트 내의 settings.py의 INSTALLED_APPS에 엡 이름 등록 

     

    <클래스 기반 뷰> 

    View: 호출 가능한 객체 

    함수 기반 뷰(FBV)

    - View 구현의 기본!! FBV로 구현할 줄 알아야 응용이 가능하다 

    - 공통 기능들은 장식자 문법으로 적용 => @api_view( ['GET'] ) = 이런 @쓰는걸 장식자 라고 한듯. 

    클래스 기반 뷰(CBV)

    - 공통 기능들은 상속 문법으로 적용 

     

    장고 기반 CBV API (Base Views)

    - Base Views : View, TemplateView, RedirectView 

    - Generic display views : DetailView, ListView

    - Generic datte views : 많아

    - Generic editing views : 많아 

     

    Base Views

    - View

    - TemplateView (localhost:8000 page를 작성) 

    - RedirectView (localhost:8000 page를 바로 localhost:8000/APP page로 이동)

     

    TemplateView => localhost:8000/ 페이지를 만들 때 사용한다. 

    project/urls.py에서 ulrpatterns에 

        path('', TemplateViews.as_view(template_name='root.html'), name='root') 작성. 

    그리고, project/settings.py에서 TEMPLATES/  'DIRS'에

       os.path.join(BASE_DIR, 'askcompany', 'templates') 추가

    root.html은 프로그램 doc의 templates를 만들어 거기 안에다가 만들기 

     

    RedirectView => localhost:8000/ 을 입력해도, localhost:8000/APP page로 이동할 수 있다.  

    project/urls.py에서 ulrpatterns에

        path('', RedirectViews.as_view(pattern_name = 'instagram:post_list',), name='root') 작성. 

     

    Web page를 바꾸는 것에는 크게 두가지가 있다. 

    1. 서버응답에서 redirect 콜을 주는것

    2. JS code로 이동시키는 방법 

     

    <장고 기반 CBV API (Generic display Views)>

    DetailView

    - 1개 모델의 1개 object에 대한 템플릿 처리 

    - template_name을 지정하지 않더라도, 모델명으로 템플릿 경로 유추 가능

     

    그전에 썻던 DetailView를 다음과 같이 새로 작성할 수 있다. 

    class PostDetailView(DetailView):
       model = Post
       def get_queryset(self):
          qs = super().get_queryset() ## super는 부모를 뜻함.
          if. not self.request.user.is_authenticated:
             qs = qs.filter(is_public=True)
          return qs
    post_detail = PostDetailView.as_view()

     

    ListView

    - 1개 모델에 대한 List 템플릿 처리 

    - 페이징 처리 지원  => paginate_by

     

    <python manage.py shell > 포스팅 page shell에서 늘리는 방법

    [1] from instagram.models import Post

    [2] post = Post.objects.first()

    [3] post.pk = None

    [4] post.save()

     

    <django-bootstrap4 설치방법>

    1. pip install django-bootstrap4 

    2. settings.py에 INSTALLED_APP추가

    3. requirement.txt에 추가

    4. html 상단에 {%???%} 추가 

     

    <뷰장식자 (View Decorators)> 

    django.views.decorators.http

    django.contrib.auth.decorators

    django.contrib.admin.views.decorators

     

    CBV에 장식자 입히기

     @method_decorator(login_required, name = 'dispatch')
     class PostListView(ListView):
        model = Post
        paginate_by = 10
     post_list = PostListView.as_view()

     

    <장고 기본 CBV API (Generic date views)>

    날짜 관련 필터링

    ArchiveIndexView: 지정 날짜필드 역순으로 정렬된목록 => model, date_field, date_list_period 필요! 

    YearArchiveView: 지정 year년도의 목록 => model, date_field, date_list_period, make_object_list 필요! 

    weekArchiveView: 지정 year/week 주의 목록 => week_format 이 %U= 한주의 시작을 일요일로, %W: 한주의 시작을 월요일로 

    DayArchiveView: 지정 year/month/day 일의 목록

    TodayArchiveView : 오늘 날짜의 목록 

    DateDetailView: 지정 year/month/day 목록 중에서 특정 pk의 detail

     

    <적절한 HTTP 상태코드로 응답하기> 

    200번대 : 성공

    - 201: 서버가 요청을 잘 처리했다.

    - 202: 작성됨. 새로운 포스팅or 댓글이 저장됐다. 

    300번대 : 추가 조치 필요 => 이동이니까 redirect 사용

    - 301: 영구 이동

    - 302: 임시 이동

    400번대 : 클라이언트측 오류

    - 400: 잘못된 요청

    - 401: 권한없음. 인증이 필요하다. 

    - 403: 인증은 했지만, 필요한 권한을 가지고 있지 않아서, 요청을 거부 

    - 404: 서버에서 요청한 리소스를 찾을 수 없다. 

    - 405: 허용되지 않는 방법. POST를 지원하는 방식예서 GET을 요청하는 경우

    500번대 : 서버측 오류

    - 500: 서버 내부 오류 발생

     

    302에 응답하는 예

    def view(request):

       return redirect('shop:item_list')

     

    404에 응답하는 예 

    def view(request):

       item = get_object_or_404(Item, pk=100)

     

    <URL Reverse를 통해 유연하게 URL 문자열 및 응답 생성하기> 

    URL Dispatcher: urls.py 변경만으로 '각 뷰에 대한 URL'이 변경되는 유연한 URL 시스템

    URL Reverse: 변경된 URL을 알아서 추적

     

    <URL Reverse를 수행하는 4가지 함수> 

    1. url 템플릿 태그 => 앱이름 만들어 주어야함.

       {% url 'blog:post_detail' 100 %}

    2. reverse 함수 

       reverse('blog:post_detail', args=[100])

    3. resolve_url 함수 : reserve를 좀 더 쓰기 쉽게 만든 것 

       resolve_url('blog:post_detail', 100)

    4. redirect 함수 : resolve_url에 기능 추가 

       redirect ('blog:post_detail', 100)

     

    resolve_url 함수는 가장 먼저 get_absolute_url() 함수의 존재여부를 체크하고, 존재할 경우 reverse를 수행하지 않고 그 리턴값을 즉시 리턴

     

     

Designed by Tistory.