web-dev-qa-db-ja.com

=(=プロトコルとドメインを含む)URLをDjango(リクエストなし)で取得するにはどうすればよいですか?

Cronジョブでメールを送信したい。メールにはアプリケーションへのリンクが含まれている必要があります。

Cronジョブでは、リクエストオブジェクトがなく、request.build_absolute_uri()を使用できません。

ここでサイトフレームワークが役立ちます。しかし、プロトコル(http vs https)を教えてくれませんか?

私のアプリケーションは再利用可能であり、httpでホストされることもあれば、httpsサイトでホストされることもあります。

更新

よくあるDjangoの方法を検索します。カスタム設定を作成することは可能ですが、Django=標準のソリューションが推奨されます。

関連問題: https://code.djangoproject.com/ticket/16734

22
guettli

このタスクには特別な標準モジュールがあります- Sites Framework 。特定のサイトを記述するサイトモデルを追加します。このモデルには、プロジェクトのドメイン用のフィールドdomainと、人間が読めるサイトの名前nameがあります。

モデルをサイトに関連付けます。そのようです:

from Django.db import models
from Django.contrib.sites.models import Site

class Article(models.Model):
    headline = models.CharField(max_length=200)
    # ...
    site = models.ForeignKey(Site, on_delete=models.CASCADE)

オブジェクトのURLを作成する必要がある場合、次のコードのようなものを使用できます。

   >>> from Django.contrib.sites.models import Site
   >>> obj = MyModel.objects.get(id=3)
   >>> obj.get_absolute_url()
   '/mymodel/objects/3/'
   >>> Site.objects.get_current().domain
   'example.com'
   >>> 'https://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url())
   'https://example.com/mymodel/objects/3/'

このようにして、複数のドメインとそれらの間に広がるコンテンツを持つことができます。ドメインが1つしかない場合でも、ドメイン設定を維持するための標準的な快適な方法を実現するために使用することをお勧めします。

インストールは非常に簡単です:

  1. 追加 'Django.contrib.sites'あなたのINSTALLED_APPS設定。

  2. SITE_ID設定を定義します。

     SITE_ID = 1
    
  3. 移行を実行します。

15
Eugene Lisitsky

TL; DR「標準的な」「ジャンゴ風」の方法はありませんが、DRYフレームワークでは、単一の構成ストアを想定しているため、カスタム設定が適切な方法のようです

デフォルトではDjangoは1つのインスタンスから任意の数のドメインとHTTP要求(より正確には、そのHTTP_Host header)のみがDjango現在のホストを決定するために使用します。cronジョブは明らかにHTTPサイクルから外れているので、設定のどこかにドメインを保存する必要があります...

# settings.py
DEFAULT_DOMAIN = 'https://foobar.com'
# or, depending on your configuration:
DEFAULT_DOMAIN = 'https://{}'.format(ALLOWED_HOSTS[0])

...小さなコンテキストプロセッサを使用して、テンプレートの処理を容易にします。

# yourapp/context_processors.py
from Django.conf import settings

def default_domain(request):
    return {'default_domain': settings.DEFAULT_DOMAIN}

...そしてメールでそれを使用します:

# yourapp/templates/email/body.html
<a href="{{ default_domain }}{% url 'target' %}">Click here</a>

または、sitesフレームワークを使用することもできますが、単一のドメインを提供している場合、設定ベースのソリューションははるかにシンプルでクリーンなように思えます。

21
Alex Morozov