제목이 거창한데 Django Ninja API 엔진에 기본 인증 방식에 Redis 를 이용하여 사용자별 JWT 토큰 값을 하나만 관리하도록 설정해 보았다. 머 Blacklist 비슷한거 아닌가? 로그인 한 후에 Redis 에 사용자 ID 키로 토큰을 저장해 두고, 다시 Login API가 호출되면 새로운 token이 발행되도록 한다. 이렇게 하면 사용기한이 남은 토큰이라도 재 발행되는 순간 쓸 수가 없게 된다. Redis 대신에 그냥 Session 정도 사용되도 될 듯 하지만 머 일단 구색으로 class AuthBearer(HttpBearer): def authenticate(self, request, token): try: print(request.headers) print(request.headers..
파일 생성을 임의로 막 할 수 없기에 메모리상에 데이터를 zip 으로 묶어서 다운로드 해야 하는 경우가 생긴다. 대부분의 예제들이 파일을 기반으로 되어 있어서 response 로 바로 내려주는 것을 찾기 어려웠는데, 아주 좋은 예제가 있어서 소개한다. 이미 많은 곳을 거쳐서 테스트 했는데 아래 코드가 그나마 동작 가능한 코드이다. https://stackoverflow.com/questions/67454/serving-dynamically-generated-zip-archives-in-django import io def my_downloadable_zip(request): zip_io = io.BytesIO() with zipfile.ZipFile(zip_io, mode='w', compression=..
전처리, 혹은 사용자가 중복으로 필요한 기능을 모아서 데코레이터로 작성해 두는 경우가 많다. 대부부의 함수에 적용시키거나 특정 함수에서 필요한 기능을 부분부분 적용시키는 데 최적이다. 일단 만들고 나면 대상 함수, 클래스에 적용하는 방법을 알아야 한다. Fuction based view 와 Class based view 에 적용 방법이 각각 다르다. 아래 사이트에 아주 잘 설명이 되어 있다. 원본 사이트로 들어가서 보시면 제 맘에 부담이 덜하겠네요 공부하는 것을 기록해 두는 용도지만 작성자의 노고를 위해서는 사이트로 가서 봐줘요 https://parkhyeonchae.github.io/2020/03/25/django-project-05/#2-decorator-%EC%A0%81%EC%9A%A9 그래도 정리..
pymongo 를 쓰니 편리하게 find 함수로 mongo shell 처럼 검색을 할 수 있다. ObjectID로 검색하려니 ObjectID 로 바꾸는 함수가 별도로 필요로 해 보이는데 (원격 쉘 접속으로 명령을 전달하는 것이 아니니깐) 아래와 같은 귀중한 코드를 구할 수 있었다. 좋은 분들이 많다. 꼭 방문해 주세요 https://ssamko.tistory.com/38 [pymongo] ObjectId로 검색하기 mongodb(pymongo)를 사용하다보면 ObjectId로 검색해야 할 일이 종종 생긴다. mongodb shell에서는 간단하게 아래와 같이 호출할 수 있지만 db.getCollection('collection_name').find({'_id':ObjectId('5f6d775c2.. ss..
한글로 된 예제를 찾기 어려웠는데, 가뭄에 단비 같은 한 개의 글이 발견! Django-ninja로 JWT token 발행 해보기 https://goo-eungs.tistory.com/64 로그인 할때, JWT 토큰을 발행해 주고 (아래 코드를 참고하시면 된다) @router.post('/sign-in/') def signIn(request): payload = { 'id': 2, 'exp': datetime.datetime.now() + datetime.timedelta(minutes=60), 'iat': datetime.datetime.now() } token = jwt.encode(payload, 'secret', algorithm='HS256') return {"token": token} HTTP..
장고에서는 아주 편리한 기능들이 거의 내장이 되어 있다. 숫자 표기시에 1000단위로 컴마를 넣는 것이 사람이 보기에 편하다고 느낀다니 이를 구현하려고 했는데 이미 humanize 라는 기능이 있다. settings.py 파일에 이 기능을 APP 에 추가하고 INSTALLED_APPS = [ ... 'django.contrib.humanize', 필요한 템플릿 페이지에서 로드해서 사용하면 된다. {% load humanize %} 라고 선언하고 실제 필요한 필드에 가서는 ` | intcomma ` 를 추가하면 된다. {{ item.quantity | intcomma }} 끝. 참고페이지는 아래 https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/ dj..
장고 모델을 만들다 보면, unique 필드로 키를 등록해서 사용하곤 한다. 그런데 중복은 되는데 각 사용자별 중복은 허용하지 않도록 지정하기 위해서는 2개 이상의 필드를 묶어서 unique 하게 동작하도록 해야 한다. 이때 사용하는 구문은 다음과 같다. UniqueConstraint https://stackoverflow.com/questions/2881043/django-create-a-unique-database-constraint-for-2-or-more-fields-together Django 2.2 introduced UniqueConstraint and the note in the official documentation on this topic suggests that unique_toge..
걍 SQL 쿼리로 업데이트 하고 싶은뎅, ORM에서 제공하는 방법으로 쓰고 싶당. 그냥 변수에 넣고 save() 함수를 부르니 객체 하나씩은 되는데 쿼리셋 전체에 대해서 하는 것은 안되네. 머야 이런것도 안되....................................가 아니라 update() 함수가 따로 있다는 >>> Entry.objects.filter(id=64).update(comments_on=True) 1 >>> Entry.objects.filter(slug='nonexistent-slug').update(comments_on=True) 0 >>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False) 132 한줄로 가쟝 s..
장고 템플릿에서 전달 받은 리스트가 막상 까보니 비어 있을때를 체크해야 한다. 보통 표로 쭉 나열하는게 기본인데, 리스트가 비워져 있다면 테이블 제목만 떡 하니 나오게 되니 플래그를 따로 다시 전달해 주는 것도 방법이지만, 이미 내장 empty 라는 키워드가 있네 그냥 쓰기만 하면 되 소스 - https://docs.djangoproject.com/en/4.0/ref/templates/builtins/ {% for athlete in athlete_list %} {{ athlete.name }} {% empty %} Sorry, no athletes in this list. {% endfor %} 위의 코드처럼 for 문안에서 endfor 닫기 전에 empty 를 사용하면 된다 Pixabay 님의 사진,..
최근 며칠 데이터 가져오기 요거 많이 쓸 듯 아래 사이트에서 가져옴 https://chartio.com/resources/tutorials/how-to-filter-for-empty-or-null-values-in-a-django-queryset/ Now, by using filter(), we can retrieve a QuerySet of just those books that were published within the last 90 days period, like so: >>> from datetime import datetime, timedelta >>> Book.objects.filter(date_published__gte=datetime.now() - timedelta(days=90)).c..
장고의 데이터 처리를 위해서 csv 내보내기를 기본 csv 라이브러리를 쓰니깐 속도가 너~~~~~~~~~~무 느려 어쩔수 없이 Pandas를 사용할 수 밖에 없네 to_csv 를 사용해서 내보내는데, 몇 초 만에 되네 ㅋㅋㅋ 한줄씩 내보내기 하니깐 몇 분 기다려도 안되던데... 암튼 내보내기 하니깐 앞에 원하지 않는 인덱스 값이 컬럼으로 들어와서 불편해서 제거하는 것을 찾아보니 떡 있네. 8-파이썬-데이터프레임의-인덱스-제거하기 정말 간단한데 to_csv 혹은 to_excel 함수를 사용하실 때 아래 코드처럼 'index=False' 만 추가하면 되거든요 👍 # file1을 인덱스 없이 '실습1_수정.xlsx'파일로 내보내기 file1.to_excel('실습1_수정.xlsx',index=False) 실제..
솔루션을 만들어도 배포해서 세상에 공개하는 것이 기술인 세상이다. 이것저것 관련 글 소스가 많지만 일단 아래 글을 참고해보자. 간단한 Django 어플리케이션 AWS에 배포하기 간단한 Django 어플리케이션 AWS에 배포하기 전통적인 방법으로 Django 어플리케이션 EC2 인스턴스에 배포하기 nearkim.coffee Gunicorn, Nginx 설치도 같이 포함되어 설명되어 있다. conf 파일 설정 방법도 물론 소개되어 있고 AWS 말고 추가로 MS Azure, Google Cloud 에도 배포하는 내용이 찾아지면 이페이지에 업데이트 하고, 제목을 바꿔야 겠다. Deehooks 님의 사진, 출처: Pexels
말그대로 장고 쓰다가 찾아보게 되는 코드 조각들을 여기에 저장해 둬 보자. 위키처럼 쭉 저장해둔다. 테마가 될때까지 timedelta 값 template에서 표기하기 가장 쉬운 솔루션으로 가자. https://stackify.dev/332647-displaying-a-timedelta-object-in-a-django-template Displaying a timedelta object in a django template - Stackify I followed Peter's advice and wrote a custom template filter. Here's the steps I took. First I followed this guide to create a custom template filte..
내부 함수가 머가 있는지 막 찾아보는데, 그냥 여기 하나 저장해 두자. 검색어는 django updateview get_success_url form_class access 이런식으로 쳐봤다. 먼가 기본 기능하다가 막 오버라이딩 하고 싶은 욕구가 많은 뷰이긴 하다. 수정이라는 기능이...상태를 바꾸거나, 어떤 작업을 해 주고 싶은데 딱 해당 폼 값만 바꾸기는 아쉽다. 아래 함수들 중에 아무거나 골라서 overriding 해서 사용하기 바란다. 보통 form_valid() form_invalid() 를 많이 쓰긴 한다. from https://dongsik93.github.io/til/2019/12/20/til-django-cbv(4)/ class FormMixin(ContextMixin): """Prov..
장고 업데이트를 위해 UpdateView 를 쓰는데, 저장할때 먼가를 바꾸기 위해서 사용자 기능을 넣기 위해서는 함수를 오버라이딩을 해야 한다. 몇개 샘플로 남겨두자. view 코드는 아래와 같다. 폼객체에 먼가를 수정을 가하고 싶다면 form_valid 오버라이딩 함수에서 instance 에 작업 하면 되겠다. class FirmwareUpdateView(...UpdateView): def form_valid(self, form): print("form_valid override") instance = form.save(commit=False) print(self.request.FILES.items()) for filename, file in self.request.FILES.items(): print..