-
장고 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를 수행하지 않고 그 리턴값을 즉시 리턴