본문 바로가기

TIL/Python

(34)
Django - 도메인이 다를 경우 Cookie.set() 진행중인 프로젝트가 개발 단계에서 배포 단계로 넘어가면서access, refresh 둘 다 그냥 쿠키에서 저장하던 것을refresh를 HTTP Only로 바꾸려고 코드를 작성해보았다.  Djangoclass CookieTokenObtainPairView(TokenObtainPairView): def finalize_response(self, request, response, *args, **kwargs): if response.data.get('refresh'): cookie_max_age = 3600 * 24 * 14 response.set_cookie( key='refresh', value=..
Django 서로 다른 필드 값 합치기 patients = Patient.objects.annotate(full_name=Concat(F('name__family'),F('name__name'),output_field=CharField())).filter(full_name__icontains=name) annotate로 full_name이라는 새 필드를 추가 full_name = Concat 함수로 name_family 필드의 값과 name_name 필드의 값을 합친 문자열을 가지는 필드 + Value()를 사용하면 합치는 기준을 주는 것도 가능
[DRF] Nested Serializer class AccountSiginAPIView(APIView): def post(self, request): account_serializer = AccountSerializer(data=request.data) if account_serializer.is_valid(raise_exception=True): subject = account_serializer.validated_data["subject"] if subject == "Patient": patient_serializer = PatientSerializer(data=request.data) if patient_seriali..
[Python] 웹 크롤링 / trafilatura https://trafilatura.readthedocs.io/en/latest/ Trafilatura는 웹 페이지에서 텍스트를 추출하기 위해 만들어진 크롤링 라이브러리로 웹 페이지에서 데이터 추출이나 텍스트마이닝을 쉽게 해주는 툴이다.HTML 문서를 처리하여 본문과 제목 등의 중요한 텍스트 요소를 추출하는 기능을 제공한다. trafilatura 를 이용하면 크롤러 구현은 매우 쉽다.텍스트만 추출할 계획이므로 불필요한 정보들은 추출하지 않도록 파라미터를 조정하고 json 으로 내보낸뒤 text 필드만 가져오면 된다.import jsonimport trafilaturadef crawl(url): downloaded = trafilatura.fetch_url(url) contents = trafi..
Django Test code 지금까지 API 테스트는 Postman을 통해 진행했었다.Test 코드를 작성하면 한줄의 명령으로 모든 테스트 케이스를 한번에 처리할 수 있다APITestCase 사용하기drf의 APITestCase를 상속받아서 클래스로 test 케이스를 만들 수 있다.# tests.pyfrom rest_framework.test import APITestCasefrom rest_framework.views import statusfrom django.shortcuts import resolve_urlfrom django.urls import reversefrom ..models import *class TestCode(APITestCase): def setUp(self): self.url_1 = '/..
DRF JWT로 로그아웃 기능 넣기 # settings.pyINSTALLED_APPS = [ 'rest_framework_simplejwt.token_blacklist',]settings.py에서 INSTALLED_APPS에 토큰 블랙리스트 추가 이후 migrate 한번 해줘야함 # urls.pyfrom django.urls import pathfrom rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, TokenBlacklistView,)urlpatterns = [ path("login/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path('logout/..
DRF Pagination 설정 / APIView 사용 시 세팅 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES' : [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10} DRF 공식문서에서 페이지네이션에 대해 설명이 있길래그대로 적용해보았는데 안되길래 여기저기 찾아보면서 좀 더 알아보았다. DRF의 Pagination 설정은 저렇게 settings.py에 설정해주면전역적으로 pagination이 적용되고 각 view별로 설정해줄수도 있는데APIView ..
DRF Serializer 패스워드 해싱 DRF를 사용해 serializer로 회원가입 기능을 구현하는데 회원가입은 되는데비밀번호가 그대로 DB에 저장되는 일이 발생했다. password : !@#$qwer 이 그대로 보인다.  그래서 serializer의 내부 메소드를 뜯어보고 장고의 AbstracUser도 뜯어보면서이리저리 고민하다가장고의 내부 메소드인 create_user를 실행하면 make_password()를 해주면서 패스워드를 해싱해준다는 걸 알았다.make_password(passowrd)의 반환 값이 user.password로 들어간다. 내가 make_password의 동작까지는 몰라도그냥 이 crate_user를 하면 패스워드가 해싱되는거 아닌가? 싶어서 한번 해보았다.from django.contrib.auth.password..
Django HTTP 301 에러 request 요청으로 DELETE 메서드를 전송하는데 계속 301 에러가 뜨길래 한참 찾아보았다. @api_view(['GET', 'DELETE']) def article_detail(request, pk): article = get_object_or_404(Article, pk=pk) if request.method == "GET": print("request_get ==========================", request) serializer = ArticleSerializer(article) print("serializer is ==============", serializer) return Response(serializer.data) elif request.method == "DELE..
[django project] 5. 해시태그 @login_required @require_http_methods(["GET", "POST"]) def create(request): if request.method == "POST": if form.is_valid(): product = form.save(request.user) for i in product.content.split(): if i.startswith('#'): tag, _ = Hashtag.objects.get_or_create(tag=i) product.tags.add(tag) return redirect("products:detail", product.pk) else: form = ProductForm context = {'form' : form} return render(req..