1. request.GET

 

request.GET은 http request의 정보를 dictionary 데이터로 받는 기능이다.

 

topic = request.GET.get("topic",None)

위의 코드를 살펴보면 request에 담겨있는 "topic"이라는 내용을 가져오는 것이다. 뒤에 None은 "topic"이라는 정보가 없으면 None을 가져온다는 의미이다. (오류 방지)

 

 

2. request.META

 

request.META는 사용자의 IP 주소와 사용자 Agent(일반적으로 웹 브라우저의 이름과 버전)를 포함해 지정된 요청에 대해 사용할 수 있는 모든 HTTP 헤더가 들어있는 파이썬 딕셔너리다.

 

  • request.META는 기본 파이썬 딕셔너리이므로 존재하지 않는 키에 접근하면 KeyError 예외 발생.
  • 헤더는 외부 데이터이므로 신뢰할 수 없고, 특정 헤더가 비어있거나 존재하지 않으면 정상적으로 동작하지 않도록 해야한다.
  • 정의되지 않는 키의 대소 문자를 처리하려면 try/except 나 get() 메소드 사용

 

1) 안좋은 예시

def ua_display_bad(request):
    ua = request.META['HTTP_USER_AGENT']  # Might raise KeyError!
    return HttpResponse("Your browser is %s" % ua)

 

2) 좋은 예시

def ua_display_good1(request):
    try:
        ua = request.META['HTTP_USER_AGENT']
    except KeyError:
        ua = 'unknown'
    return HttpResponse("Your browser is %s" % ua)

 

3) 좋은 예시

def ua_display_good2(request):
    ua = request.META.get('HTTP_USER_AGENT', 'unknown')
    return HttpResponse("Your browser is %s" % ua)

 

출처 : https://yonghyunlee.gitlab.io/python/django-master-6/

 

 

3. requests

django에서 POST나 GET을 사용하는 requests라는 모듈이 있다. 

 

https://docs.python-requests.org/en/master/user/quickstart/

 

'Back-End > Django' 카테고리의 다른 글

Wagtail Django_extensions, ipython  (0) 2021.11.19
Django Signals  (0) 2021.10.22
Django ORM  (0) 2021.10.21
Django iamport 적용하기  (0) 2021.10.06
Django Bulma 적용 방법  (0) 2021.08.24

 

https://django-ninja.rest-framework.com/tutorial/authentication/

 

Authentication - Django Ninja

Authentication Intro Django Ninja provides several tools to help you deal with authentication and authorization easily, rapidly, in a standard way, and without having to study and learn all the security specifications. The core concept is that when you des

django-ninja.rest-framework.com

 

 

Django Ninja에서 제공하는 Authentication 기능이다. 다양한 방식의 Authentication을 제공하는데 JWT(JASON Web Token)으로 하는 방법에 대해서 간단 정리하려고 한다.

 

일단 OAuth에 대해서 잠깐 집고 넘어가자. 

 

 

OAuth 2.0(Open Authorization 2.0, OAuth2)은 인증을 위한 개방형 표준 프로토콜입니다.

이 프로토콜에서는 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.

OAuth에 대해선 위 블로그에 자세하게 나와있다. 내용을 전부 알고 있으면 좋겠지만 이번 포스팅의 주제에 벗어나므로 간단하게 흐름도만 파악하고 넘어가려고 한다. 

 

Google의 로그인 기능을 사용하기 위해서는 Client가 Google에 Access Token을 요청하고 전달 받는다. 물론 Token을 요청하고 받기 위해서는 미리 설정을 해줘야한다. Google의 개발자 콘솔이 그것이다. 

과거에는 AJax를 이용하여 비동기 통신을 했지만 최근에는 SPA인 Vue나 React를 이용하여 Frontend와 Backend를 분리해서 구축한다. 로그인 요청은 Frontend에서 하기 때문에 개발자 콘솔에서 URL 설정은 Frontend의 URL주소로 설정해줘야한다. 

 

원본은 Frontend URL, 리디렉션에는 Login 기능이 있는 URL를 적어주면 된다. 

 

Frontend와 Backend에서 정보를 주고 받을 때 사용하는 것이 JWT이다. Bearer 보안으로 이루어져있는데 Django Ninja에서는 이 토큰을 받고 Authentication을 처리해주는 기능을 제공한다. 

 

 

from ninja.security import HttpBearer


class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        if token == "supersecret":
            return token


@api.get("/bearer", auth=AuthBearer())
def bearer(request):
    return {"token": request.auth}

API auth에 Authentication 방식을 설정해놓으면 API를 실행하기 전에 관련 Authentication Class를 통과한 다음 실행한다. authenticate의 token이 API요청 클라이언트에 포함되어 있는 Bearer token을 파싱해서 가져온다. 

token에는 유저의 정보가 들어있다. 

 

import jwt

from rest_framework_simplejwt import settings


payload = jwt.decode(jwt=token, key=settings.DEFAULTS['SIGNING_KEY'], algorithms=settings.DEFAULTS['ALGORITHM'])
user_id = payload['user_id']

 

Google Social Login을 위해 이미 만들어져 있는 라이브러리를 사용하기 위해 로그인 기능만 REST FRAMEWORK를 사용했다. Django Setting에 들어가보면 secret key가 있는데 암호화를 사용할 때 사용하는 중요한 정보이다. Wagtail에서는 dev.py에 있다. key는 Django Secret key를 사용하면 되고 알고리즘은 "HS256"을 사용하는데 설정 값을 가져와서 넣는 것이 안전하다. 

'Back-End' 카테고리의 다른 글

Django Migrations오류  (0) 2021.12.15

항상 migrations폴더의 내용과 db.sqlite3를 날리고 했다. 하지만 불편하게 이만저만이 아니였다. db관련 오류가 발생하면 오류와 해결방법을 적으려고 한다. 

 

 

1. wagtail video 오류 

-> media 폴더의 original_video폴더를 지우면 된다. 아마 의존성 오류가 발생인데 video관련 테이블이 생성되기도 전에 video가 있어서 생기는 오류이다. 

 

2. table 생성관련 오류

-> 기존 모델을 지우고 새로운 모델을 생성할 때, 단순히 모델의 이름을 바꾸는 것이 아니라 새로운 필드와 관계형 모델을 설정할 때, migrations적용할 때, 이름만 바꾸겠냐고 물어보면 no를 해야한다. 

그리고 혹여나 오류가 발생했을 때에는 오류의 내용을 잘 읽어보고 해결하면 된다. 대부분 관련 모델의 테이블을 직접 db에서 삭제를 해주면 된다. 그리고 모든 app의 migrations 폴더의 __init__.py만 남겨두고 삭제한다. 

 

이후에 migrations와 migrate만 실행하면 문제가 없을 것이다. 

 

python manage.py dbshell -> db shell 접속
python manage.py migrate user -> user app만 migrate 진행

'Back-End' 카테고리의 다른 글

Django Ninja Authentication(Bearer)  (0) 2021.12.16

REST API 설계시 가장 중요한 항목은 아래 두가지이다.

1️⃣ URI는 정보의 자원을 표현해야 한다는 점
2️⃣ 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다는 점

 

두 가지를 기억하며, 좀 더 RESTful한 URL을 설계해보자!(REST API에 대해 더 알아보려면? 👉 클릭  )

 

 

1. 소문자를 사용한다. 

주소에서 대소문자를 구분하므로, 카멜방식이 아닌 소문자를 사용하여 작성한다.

 

Bad

http://restapi.example.com/users/postComments

Good

http://restapi.example.com/users/post-comments

 

2. 언더바를 대신 하이픈을 사용한다.

가급적 하이픈의 사용도 최소화하며, 정확한 의미나 표현을 위해 단어의 결합이 불가피한 경우에 사용한다.

 

Bad

http://restapi.example.com/users/post_comments

Good

http://restapi.example.com/users/post-comments

 

3. 마지막에 슬래시를 포함하지 않는다.

슬래시는 계층을 구분하는 것으로, 마지막에는 사용하지 않는다.

 

Bad

http://restapi.example.com/users/

Good

http://restapi.example.com/users

 

4. 행위는 포함하지 않는다.

행위는 URL대신 Method를 사용하여 전달한다.(GET, POST, PUT, DELETE 등)

 

Bad

POST http://restapi.example.com/users/1/delete-post/1

Good

DELETE http://restapi.example.com/users/1/posts/1

 

5.파일 확장자는 URI에 포함시키지 않는다.

REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않습니다. Accept header를 사용하도록 한다.

 

Bad

http://restapi.example.com/users/photo.jpg

Good

GET http://restapi.example.com/users/photo

HTTP/1.1 Host: restapi.example.com Accept: image/jpg

 

6. 가급적 전달하고자하는 자원의 명사를 사용하되, 컨트롤 자원을 의미하는 경우 예외적으로 동사를 허용한다.

 

Bad

http://restapi.example.com/posts/duplicating

Good

http://restapi.example.com/posts/duplicate



출처: https://devuna.tistory.com/79?category=939368 [튜나 개발일기]

'IT 용어, 상식' 카테고리의 다른 글

응답코드  (0) 2021.12.10

💡 HTTP 응답 코드

1️⃣ 200번대 :  성공

  • 200: Ok, 클라이언트의 요청을 정상적으로 수행함.
  • 201: Created, 클라이언트에게 생성 작업을 요청받았고, 생성 작업을 성공함.
  • 204: No Content, 요청은 성공했으나 응답할 콘텐츠가 없음.
  • 205: Reset Content, 요청은 성공했으나 클라이언트의 화면을 새로 고침하도록 권고
  • 206: Partial Content, 요청은 성공했으나 일부 범위의 데이터만 반환함.

2️⃣ 300번대 : 리다이렉션

  • 301: Moved Permantly, 클라이언트가 요청한 리소스에 대한 URI가 영구적으로 변경되었음을 의미.
  • 302: Found, 요청한 URI가 일시적으로 주소가 바뀌었을 경우를 의미.
  • 303: See Other, 요청한 자원이 임시 주소에 존재함.
  • 304: Not Modified, 이전에 방문했을 때의 요청 결과와 다르지 않을 경우(캐시 된 페이지를 그대로 사용)
  • 307: Temporary Redirect, 임시 페이지로 리다이렉트. 

3️⃣400번대 : 클라이언트 오류

  • 400: Bad Request, 클라이언트가 올바르지 못한 요청을 보냄.
  • 401: Unauthorized, 인증 혹은 승인되지 않은 접근(로그인을 하지 않아 페이지를 열 권한이 없음)
  • 403: Forbidden, 금지된 페이지, 로그인을 하든 안하든 접근할 수 없음. (관리자 페이지)
  • 404: Not found, 찾을 수 없는 페이지, 주소를 잘 못 입력했을 때 사용함.
    인증받지 않은 클라이언트로 부터 리소스를 숨기기 위해 403 대신에 사용할 수도 있음.(해커들의 공격을 방지하고자 페이지가 없는 것처럼 위장하는 경우)
  • 405: Method Not Allowed, 허용되지 않은 요청 메소드를 받았을 경우.
  • 408: Request Timeout, 요청 시간이 초과됨.
  • 409: Conflict, 서버가 요청을 처리하는 과정에서 충돌이 발생한 경우. (회원가입 중 중복된 아이디인 경우)
  • 410: Gone, 영구적으로 사용할 수 없는 페이지.

4️⃣500번대 : 서버 오류

  • 501: Not Implemented, 해당 요청을 처리하는 기능이 만들어지지 않음.
  • 502: Bad Gateway, 서버로 가능 요청이 중간에서 유실된 경우.
  • 503: Service Unavailable, 서버가 터졌거나 유지 보수 중
    (유지 보수 중일때는 유지 보수 중이라는 것을 알려주는 페이지로 전송해주는 것이 좋음)
  • 504: Gateway Timeout, 서버 게이트웨이에 문제가 생겨 시간 초과가 된 경우.
  • 505: HTTP Version Not Surpported, HTTP 버전이 달라 요청이 처리할 수 없음.



출처: https://devuna.tistory.com/78?category=939368 [튜나 개발일기]

'IT 용어, 상식' 카테고리의 다른 글

REST API URL 규칙  (0) 2021.12.10

https://www.pythoneatstail.com/en/overview-all-articles/social-accounts-login-using-allauth/

 

Social account signup and login with allauth in Django - PythonEa

The default behavior of the social account signup is that allauth tries to log the user in after the connection to the social account has been made. This is something you may not want, when you want the user to fill in some required fields that the social

www.pythoneatstail.com

 

STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, 'static'),
    os.path.join(BASE_DIR, 'userauth/static/userauth/'),
]

Static File 위치 추가

 

 

SOCIALACCOUNT_AUTO_SIGNUP = False

Social 로그인 이후에 바로 가입 방지 (추가 정보 필요할 때 사용한다.)

 

+ Recent posts