티스토리 뷰
0. 들어가기전에
else로 분기하여 사용가능한 것들이 있다.
- 메세지 프레임워크를 사용하여 메인페이지로 이동
- 403 status code를 반환
alert기능 구현하기
공식사이트
검색) django messages framework (= flash message)
https://docs.djangoproject.com/en/3.0/ref/contrib/messages/
일회성 알림 메세지로 flash message라고도 한다. 왜냐하면 한번 알리고 새로고침 하면 없어진다.
즉, 임시적으로 메세지 알려준다.
읽어보면 one-titme notification message(한번만 알려준다)이다.
쿠키와 세션으로 나누어진다.
위의 내용을 보면 startproject하면 이제 포함 되어 있다고 말해준다.
settings에 미리 다 포함 시켜 놨다.
구현
기본적으로 bootstrap4가 설치.
settings.py
아래 부분의 다음 내용을 추가하자
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
cookie가 기본값인데 우리는 session으로 쓰겠다는 설정이다.
views.py
from django.contrib import messages
messages.warning(request, 'Your account expires in three days.')
예시 코드
사실 이렇게 적어도 뜬다.
이때 주의 할 점은 redirect하면 처음부터 돌아가기 때문에 안뜬다. render해서 바로 html로 이동하기 때문에 messageframework가 뜬다.
종류는 아래와 같다
messages.debug(request, '%s SQL statements were executed.' % count)
messages.info(request, 'Three credits remain in your account.')
messages.success(request, 'Profile details updated.')
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')
html
특정html에 적는 것 보단, base.html에 적는 것이 편하다.
추가적으로 하려면 하래 처럼 적어서 필요한 부분을 확인하면된다.
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
이렇게 적어준다.
여기서 더 이쁘게 하기 위해서는 bootstrap를 추가해 주면 된다.
bootstrap의
<div class="alert alert-primary" role="alert">
This is a primary alert—check it out!
</div>
과 위의 코드를 결합해보자.
최종 코드(+bootstrap)
{% if messages %}
<div class="messages">
{% for message in messages %}
<div class="alert alert-{% if message.tag %}{{ message.tags }}{% endif %}" role="alert">
{{ message }}
</div>
{% endfor %}
</div>
위의 messages를 import 선언 없이 쓸 수 있는 이유는 settings -> templates -> options -> context_processors가 html에서 기본적으로 쓸 수 있는 것들을 정의한 것 들이다. 4번째 줄은 messages를 변수로 그냥 쓸 수 있게 하는 거라고 이해하면 된다.
ex) 댓글 부분 메세지 프레임 워크 넣기
settings.py
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
base.html
{% if messages %}
{% for message in messages %}
<div{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>{{ message }}</div>
{% endfor %}
{% endif %}
views.py
@require_POST
def comments_create(request, pk):
if request.user.is_authenticated:
article = get_object_or_404(Article, pk=pk)
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user
comment.article = article
comment.save()
return redirect('articles:detail', article.pk)
else:
messages.warning(request, '댓글 작성을 위해서는 로그인이 필요합니다.')
return redirect('accounts:login')
상태코드 보여주기
우리가 반환해야 하는 것은 response object 하나이다. response object를 반환하기 위해서는 render, redirect 뿐만아니라도 반환 할 수 있는 다양한 객체들이 존재한다. 즉, 상태코드를 보여주기도 가능하다.
400 | 잘못된 요청 |
401 | 권한 없음(로그인 x) |
402 | 결제 필요 |
403 | 필요 권한이 없음(관리자 권한이 없음) |
https://docs.djangoproject.com/en/3.0/ref/request-response/
위의 사이트 들어가서 위의 캡쳐 부분을 읽어보자.
우리는 403 에러를 보여주면서 권한이 없다는 걸 알려줘 보자.
코드는 간단하다.
views.py
~
~
~
else:
from djang.http import HttpResponseForbidden
return HttpResponseForbiden()
만약 401에러를 보여주고 싶다면, 401은 위의 객체처럼 사용가능한 것이 없기 떄문에 아래와 같이 작성한다
else:
from djang.http import HttpResponse
return HttpResponse(status=401)
- Total
- Today
- Yesterday
- logout
- JavaScript
- django
- Vue
- vuejs
- BFS
- Queue
- useState
- react
- mongoDB
- login
- react autoFocus
- nextjs autoFocus
- NextJS
- TensorFlow
- useHistory 안됨
- error:0308010C:digital envelope routines::unsupported
- Python
- Express
- 클라우데라
- Deque
- DFS
- 자연어처리
- UserCreationForm
- read_csv
- next.config.js
- typescript
- nodejs
- pandas
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |