2014-09-13 5 views
3

나는 비교적 단순하게 보이려고 노력하고 있습니다.하지만 완전히 엉망입니다. 모델이 있고 인스턴스가 처음 생성되면 전자 메일을 보내려고합니다. 나는이를 사용하여 충분히 쉽게 할 수 있습니다모델이 생성되었을 때 (요청 객체없이) absolute_uri를 사용하여 메일 보내기

@receiver(models.signals.post_save, sender=MyModel) 
def execute_after_save(sender, instance, created, *args, **kwargs): 
    if created: 
     send_mail(mail_type='MyModel_created', instance=instance) 

그러나, 문제는 내가 관리자 패널에서 모델의 변화보기로 전자 메일에있는 링크를 보낼 필요가있다. 나는 위에서 언급 한 send_mail() 함수 내부 링크 구축 (다른 경우)과 같은 코드를 사용하고 :

mymodel_admin_url = request.build_absolute_uri(reverse('admin:mymodels_mymodel_change', args=(instance.id,))) 

을하지만 당신은이 '외설하는 요청 객체를 가지고에 의존하는 것을 알 수 있습니다 post_save 신호 나 심지어 save 메소드를 통과하지 못했습니다. 이 경우 필요한 링크를 얻는 가장 좋은 방법은 무엇입니까?

요청을 통과하는 모든 것을 다시 작성하고 무시하는 것 (예 : save 메소드, base_save 메소드, post_save 신호 등)은 악몽처럼 보입니다. 그러나 사이트 프레임 워크를 사용하여 필요한 링크를 얻을 수 없습니다 (일부 경우 하위 도메인에 사이트를 사용하거나 예를 들어 manage.py runserver를 사용하여 테스트 할 때). 사이트 프레임 워크를 호출하면 올바른 링크가 작성되지 않습니다.).

+1

이것은'sites' 프레임 워크의 전형적인 유스 케이스처럼 보입니다. 그게 왜 효과가 없을 지에 대해 설명해 주시겠습니까? 장고가 웹 서버가 응답 할 도메인 이름을 알 수있는 방법이 없으므로 링크를 만들 때 사용할 도메인 이름을 알려줘야합니다. 그것은 코드 일 수 있지만,'sites' 프레임 워크는 일반적으로 더 융통성이 있습니다. –

+0

@KevinChristopherHenry - 사이트 프레임 워크를 사용하는 것은 settings.py의 SITE_ID를 호출하는 행에 따라 수행 한 다음 데이터베이스에서 설정 한 사이트 (예 : SITE_ID = 1)에 액세스하는 데 사용합니다. 편집 : 나는 domain = Site.objects.get_current() 사용 믿습니다. 이것은 내 링크를 만들 때 "example.com"을 불러 오지만 내 dev 서버 ("dev.example.com") 또는 관리를 사용할 때는 전혀 유용하지 않습니다.py runserver ("127.0.0.1:8000"). request.build_absolute_uri와 같이 사이트 프레임 워크를 사용하여 실제 절대 URL을 반환하는 방법이 있습니까? –

답변

2

request.build_absolute_uri()처럼 실제 절대 URL을 반환하기 위해 사이트 프레임 워크를 사용할 수 있습니까?

일반적으로 은 실제 URL 인이 아닙니다. 장고는 웹 서버가 없어도 이메일을 생성하고, 모델을 저장하고 (예 : 사후 저장 신호를 트리거하는) 웹 서버가 있으면 정상적으로 작동 할 수 있습니다. 그리고 웹 서버가 있으면 장고가 어떤 도메인 이름을 서비스하는지 알 수있는 방법이 없습니다. 왜 요청 객체가 필요하고 왜 ALLOWED_HOSTS과 같은 설정이 필요한지입니다.

일반적으로 처리하는 일반적인 방법은 장고에게 어떤 사이트가 제공되는지 명시 적으로 알려주는 것입니다. 예를 들어, 각 배포판마다 다른 설정 파일을 가지며 각 파일은 sites 프레임 워크를 사용하는 경우 SITE_ID 설정을 통해 사용할 도메인 이름을 나타내거나 그렇지 않으면 명시 적으로 설정할 수 있습니다. 자신의 설정). 다른 서버에 대해 다른 설정 파일을 사용하는 것이 일반적입니다.

웹 요청 (관리자를 통해 저장)에서 저장이 실행되는 것처럼 들리는 경우가 있습니다. 따라서 요청을 받으면 도메인 이름을 사용하여 링크를 구성 할 수 있습니다 . Django는 인수로 전달되는 것 외에는 요청을받을 수있는 방법이 없습니다. 당신은 이것을 원할 처음은 아니지만 "Django global request"를 검색하면 다른 사람들이 어떻게 문제에 접근했는지 알 수 있습니다. 예를 들어 This article은 몇 가지 아이디어를 제시하고 this app은 "코드 경로를 명시 적으로 전달하지 않고 Django의 HTTPRequest 객체에 대한 액세스 권한을 필요할 때마다 제공하도록 설계되었습니다".

+0

아, 대답은 내가 바라는 것이 아니라, 메신저를 쏘는 것이 아닙니다. 정보 주셔서 감사합니다! 나는 아마 이것을 포기하고 "부정확 한"사이트 프레임 워크 도메인을 사용할 것입니다. –