올려주신 코드에서 ManyToMany 관계를 맺기 전에 pk(즉, id) 값이 필요하기 때문에 bulk_create를 수행하고 tag_set.add 매서드를 호출한다고 강의에서 설명해주셨습니다. def create_posts(orig_post_list): """포스팅 생성""" category_dict = {category.name: category for category in Category.objects.all()} tag_dict = {tag.name: tag for tag in Tag.objects.all()} user_list = list(User.objects.all()) post_list = [] for orig_post in orig_post_list: post = Post( category=category_dict[orig_post["category_name"]], author=choice(user_list), title=orig_post["title"], status=choice([Post.Status.DRAFT, Post.Status.PUBLISHED]), content=orig_post["content"], ) post._tag_list = orig_post["tag_list"] post.slugify() post_list.append(post) if post_list: print(f"{len(post_list)} 개의 포스팅 생성") Post.objects.bulk_create(post_list, batch_size=1000) for post in post_list: _tag_list = [tag_dict[tag_name] for tag_name in post._tag_list] post.tag_set.add(*_tag_list) 그러나 해당 코드를 실행 시 여전히 tag_set.add를 위해서는 id가 필요하다고 에러가 발생합니다. 사용 중인 DB는 mysql 이며, 일단 임시 변통으로 bulk_create 전에 id를 직접 할당하여 해결하였습니다. for idx, orig_post in enumerate(orig_post_list): post.id = idx + 1 # id는 0이 될 수 없음 그러나 이는 --clear argument를 주었기 때문에 가능한 행위였습니다. 수정하기 위해서 하기와 같은 방법이 적절할까요? 그리고 왜 제 경우만 에러가 발생하는 걸까요? if post_list: print(f"{len(post_list)} 개의 포스팅 생성") Post.objects.bulk_create(post_list, batch_size=1000) tag_lists = [t for t in orig_post["tag_list"]] post_list = Post.objects.all() # id 로드를 위함 for post, tag_list in zip(post_list, tag_lists): _tag_list = [tag_dict[tag_name] for tag_name in tag_list] post.tag_set.add(*_tag_list)
질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요. 질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다. 시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다. 오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다. 당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-) 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
명령어가 아닌, docker 컨테이너에서 데몬으로 만들어 사용해 보려고 celeryd를 https://celery-safwan.readthedocs.io/en/latest/userguide/daemonizing.html 위 레퍼런스를 따라 설정을 해보았는데 이틀동안 작업을 해보았지만, 결코 celery가 작업을 가져가지 않더라고요. 혹시 사용해 보신적이 있다면 제가 사용한 설정 내용에서 오류가 있는지 확인을 부탁드려도 될까요? # Names of nodes to start # most people will only start one node: CELERYD_NODES="worker1" # but you can also start multiple and configure settings # for each in CELERYD_OPTS #CELERYD_NODES="worker1 worker2 worker3" # alternatively, you can specify the number of nodes to start: #CELERYD_NODES=10 # Absolute or relative path to the 'celery' command: CELERY_BIN="/usr/local/bin/celery" #CELERY_BIN="/virtualenvs/def/bin/celery" # App instance to use # comment out this line if you don't use an app CELERY_APP="config" # or fully qualified: #CELERY_APP="proj.tasks:app" # Name of the projects settings module. export DJANGO_SETTINGS_MODULE="config.settings.dev" # Where to chdir at start. CELERYD_CHDIR="/www/test-project" CELERYBEAT_CHDIR="/www/test-project" # Extra command-line arguments to the worker CELERYD_OPTS="--time-limit=300 --concurrency=2" # Configure node-specific settings by appending node name to arguments: #CELERYD_OPTS="--time-limit=300 -c 8 -c:worker2 4 -c:worker3 2 -Ofair:worker1" # Set logging level to DEBUG #CELERYD_LOG_LEVEL="DEBUG" # Name of the celery config module. # CELERY_CONFIG_MODULE="config.celery" CELERYD_LOG_LEVEL="INFO" # %n will be replaced with the nodename. CELERYD_LOG_FILE="/log/gunicorn/celery/celery-%n%I.log" CELERYD_PID_FILE="/log/gunicorn/celery/celery-run-%n.pid" CELERYBEAT_LOG_FILE="/log/gunicorn/celerybeat/celerybeat.log" CELERYBEAT_PID_FILE="/log/gunicorn/celerybeat/celerybeat-run.pid" # Workers should run as an unprivileged user. CELERYD_USER="root" CELERYD_GROUP="root" # If enabled pid and log directories will be created if missing, # and owned by the userid/group configured. CELERY_CREATE_DIRS=1
django에서 view나 api로 받은 request 정보를 celery에 넘겨 client에게 응답 처리를 하게 만들 수 있을까요? 시리얼라이저 문제로 celery에서 request를 arg로 받을 수 없는 것으로 알고 있습니다. 그래도 tcp를 이용한 전송이기 때문에 가능은 할것 같은데 어떻게 접근해야 될지 가늠이 되지 않아 혹시 비슷한 고민을 해보신 적이 있으실까 싶어 이렇게 질문을 드려봅니다.
7-37번강의에 관련 커밋으로 아래 처럼되어 있는데 delete 예시 url이 잘못연결되어 있는것같습니다. pre_save 예시 : slugify 자동 호출 post_save 예시 : User 생성 시에 Profile 자동 생성 post_delete 예시 : Profile 삭제 시에 관련 이미지 파일 자동 삭제 django-lifecycle 예시 : blog.Post의 content/status 변경 탐지 연결되야할 페이지: https://github.com/pyhub-kr/course-django-complete-guide-v3/commit/563749a5be33f10ec46a166faf29bbaa0e1d7144 현재 연결된 페이지: https://github.com/pyhub-kr/course-django-complete-guide-v3/commit/714c274e0d6f26b68aa5bc75a9bf2a78c924633c 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
진행중 사진과 같이 정상적으로 카드정보 입력후 결제를 진행했음에도 불구하고 결제실패로 출력됩니다. 코드는 강의와 동일하고 또한 올려주신 깃허브 코드와도 비교하여 교차검증을 진행한 결과 동일합니다. 디버깅시 오류 또한 존재하지 않습니다. 이 경우 해결방안에 대해 어떻게 접근하는게 좋을지 알려주실 수 있을까요..?
이전에 아래와 같이 답변을 주신 글이 있습니다. 1. Consumer가 거절하는 경우는 대부분 Celery자체가 어떻게 처리해야 할지 몰라서 일어나는 경우고, 보통 그런경우 새로운 Queue를 만드셔서 넣어 놓으신다음에 엔지니어가 나중에 수동으로 처리하는 경우가 대부분이고, 많은 에러가 난다면 그 전체를 다시 Queue에 넣어 Consumer를 고친 다음에 처리합니다. 2. ACK Timeout이 나는 경우 Broker에서 확답을 못 받았기 때문에 그 메세지는 그대로 있고, Consumer가 재시작하는 순간에 다시 Queue에서 불러와 처리할 수 있습니다. 이에 추가적인 질문을 드리려 합니다. 1번에 대한 질문에서 거절이라는 의미로 "celery에서 작업을 가져왔지만 어떻게 처리할지 모른다"는게 이해가 잘 가지 않네요. 이미 구현된 코드에서 처리할지 모른다는 경우가 어떤게 있을까요? 잘못된 arguments는 에러가 발생할 테고, 작업에서 만약 DB나 I/O가 필요한데 해당 정보가 없다면... 이 또한 예외나 에러가 발생할 텐데.. 이러한 모든 상황은 3번에 포함되는 것이라 1번의 경우가 어떤게 있을지 예시를 혹시 들어주시면 감사드리겠습니다. 2번에 대해 ack는 수신자가 전달하는 것인데 consumer는 queue에서 작업을 가져가서 처리하지만 queue에서는 ack를 timeout 내 수신하지 못한 상황이고, 이 때문에 queue에서 작업을 삭제하지 않았다면 consumer는 동일한 작업을 다시 가져가 중복처리를 하게 되는거 아닌가요? 이에 대한 처리는 실무에서는 어떻게 하는지 알고 싶습니다.
챕터 Template 에서 영상 35:09초 상속작업관련 이해가 안가는게있습니다. 저는 base.html에 {% load static %}만 기입하고 자식인 blog_list.html에서는 기입을 안 했는데, 모든 태그(h1, h2)가 색상이 변경된 상태 입니다. 장고는 5.0.6인데 이게 업데이트가 된건가요?
DLX에서 consumer가 DLQ에 에러를 저장하는 과정에 대해 이해가 잘 안되는 부분이 있습니다. 에러가 발생하면 DLQ에 넣는다. 다음 처리를 하는데 들어온 이벤트의 타입을 DLQ의 에러가 발생한 이전 이벤트 타입과 동일한지를 비교하여 같다면 있다면 DLQ에 넣는다 2번 처리에서 consumer는 모든 작업을 수행하기 전 이벤트 타입을 DLQ에 있는 모든 이벤트 타입과 비교하는 작업을 한다는 전제인가요? 그렇다면 일반적으로 DLQ에 누적되는 각기 다른 이벤트 타입의 수가 많지 않을 것이기 때문에 (동일한 이벤트 타입들은 사실 1개로 처리) 이벤트 실행 중 발생하는 에러 결과를 DLQ에 넣는 것 보다, 작업 전 이미 발생한 에러 이벤트 타입과 비교하여 동일한 이벤트 들은 처리를 하기 전, DLQ에 넣는게 전체적으로 효율성이 높기 때문이라 볼 수 있는 것일까요?
message들은 아래와 같은 경우가 원인이 될 수 있다고 말씀 하셨습니다. 1. consumer가 거절하는 경우 2. 시간이 너무 오래 걸려 acknowledgment timeout이 발생한 경우 3. 처리를 하는 동안 에러가 발생한 경우 첨부된 pdf나 코드상에서 최종 언급되는 방법으로 3번에 대한 항목만 있는 것 같은데요 두 가지 질문이 있습니다. 1번 질문으로 1,2번 항목은 사실 consumer가 처리할 수 없는거 아닌가 생각되는데 redis를 사용하는 지금 프로젝트에서 따로 처리를 하는 방법이 방법이 어떻게 있을지 알고 싶습니다. 2번 질문으로 제가 알고 있기로 rabbitMQ에서 ack와 관련한 기능이 있는 것으로 알고 있습니다. 혹시 해당 작업을 해보신적이 있으시다면 어떻게 처리, 구현 하셨는지 알고 싶습니다.
장고 5 부터 LogoutView로의 요청은 POST 방식만 허용 장고 버전을 올려 봤는데, 이러 이슈가 생길 수도 있네요 :) [30/Jun/2024 11:43:53] "GET /accounts/logout/ HTTP/1.1" 405 0 Method Not Allowed (GET): /accounts/logout/ Method Not Allowed: /accounts/logout/
gunicorn을 사용하면 nginx의 사용으로 static 제공이 되지 않으면 css, js가 다운로드 되지 않는 것으로 알고 있습니다. 저장소의 celery 폴더에도 runserver를 사용하셨던데 이 설명이 강의 초반부터 지금까지 못본것 같습니다. 실습에 admin 페이지가 다 깨져 나오기 때문에 모르는 다른 학습자 분들이 있다면 큰 어려움이 있을것 같습니다. 직접 테스트 해보니 gunicorn 실행에는 admin이 다 깨져서 나오고 runserver로 실행하면 admin이 제대로 나오는 것을 확인하였습니다. docker-compose의 app 항목 추가 : command: > sh -c " python manage.py makemigrations && python manage.py migrate && gunicorn -b 0.0.0.0:8000 app.wsgi "
코드를 직접 타이핑하여 테스트 하는데 문제가 많아 화면 하단에 있는 수업 노트 보기에 있는 저장소를 clone해 보았습니다. celery 폴더에 있는 docker-compose를 그대로 실행해보았습니다. 전제는 검증된 코드기 때문에 일단, 문제가 없을 것이고 해당 코드를 기반으로 제 문제를 추적하기 위해서 입니다. docker-compose를 실행하니 대부분의 컨테이너에서 문제가 발생하는 것을 확인하였습니다. 여러 유료 강좌를 돈과 관계 없이 저에게 필요하다면 구매를 해서 보는 사용자로, 각 실습별로 코드가 제공되지 않는 것이 참 어렵다 생각했습니다. 헌데 참고할 저장소의 코드도 신뢰할 수 없다는 것에 실망이 생깁니다. 저장소의 코드에 대해 확인을 부탁 드리고자 합니다.
main.py 와 celery.py 의 코드가 수업 내용에 따라 어떻게 되는지 전체가 제공이 되지 않아 특히 main.py 는 예상만 하며 따라하고 있습니다. 그 중에 group에 대한 질문입니다. celery와 celery-standalone을 실행하면서 각각 celery, celery:1, celery:2 그리고 celery:3, celery:4, celery:5를 각각 큐로 할당하였습니다. 이때 task_router의 설정과 관련해서 celery-standalone에서 add에 대한 task 작업 큐를 celery로 정의해도 동작하나요? 아니면 자신의 celery에 할당된 큐에대해서 task 큐를 할당할 수 있는 것인가요?