Bagaimana cara mendapatkan nama domain dari situs saya saat ini dari dalam template Django? Saya sudah mencoba mencari di tag dan filter tetapi tidak ada.
python
django
django-templates
Jean-François Fabre
sumber
sumber
request.META['HTTP_HOST']
memberi Anda domain. Dalam sebuah templat akan seperti itu{{ request.META.HTTP_HOST }}
.Host:
header dan mendapat respons kembali dengan domain palsu di suatu tempat di halaman, bagaimana cara membuat lubang keamanan? Saya tidak melihat bagaimana itu berbeda dari pengguna yang mengambil HTML yang dihasilkan dan memodifikasi dirinya sendiri sebelum mengumpankannya ke browser miliknya.Jika Anda ingin tajuk Host HTTP asli, lihat komentar Daniel Roseman pada jawaban @ Phsiao. Alternatif lain adalah jika Anda menggunakan kerangka contrib.sites , Anda dapat menetapkan nama domain kanonik untuk suatu Situs dalam basis data (memetakan domain permintaan ke file pengaturan dengan SITE_ID yang tepat adalah sesuatu yang harus Anda lakukan sendiri melalui Anda pengaturan server web). Dalam hal ini yang Anda cari:
Anda harus menempatkan sendiri objek current_site ke dalam konteks template jika Anda ingin menggunakannya. Jika Anda menggunakannya di mana-mana, Anda bisa mengemasnya dalam prosesor konteks templat.
sumber
SITE_ID
pengaturan Anda sama denganid
atribut situs saat ini di aplikasi Situs (Anda dapat menemukanid
di panel admin Situs). Ketika Anda meneleponget_current
, Django mengambilSITE_ID
dan mengembalikanSite
objek dengan id itu dari database.print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
Saya telah menemukan
{{ request.get_host }}
metodenya.sumber
HTTP_X_FORWARDED_HOST
header HTTP.request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/… )Melengkapi Carl Meyer, Anda dapat membuat pemroses konteks seperti ini:
module.context_processors.py
pengaturan lokal .py
settings.py
templat yang mengembalikan konteks misalnya situs url adalah {{SITE_URL}}
Anda dapat menulis rutine Anda sendiri jika ingin menangani subdomain atau SSL di pemroses konteks.
sumber
Variasi dari pengolah konteks yang saya gunakan adalah:
The
SimpleLazyObject
wrapper memastikan panggilan DB hanya terjadi ketika template benar-benar menggunakansite
objek. Ini menghapus kueri dari halaman admin. Itu juga cache hasilnya.dan sertakan dalam pengaturan:
Di dalam templat, Anda bisa menggunakan
{{ site.domain }}
untuk mendapatkan nama domain saat ini.sunting: untuk mendukung pengalihan protokol juga, gunakan:
sumber
SimpleLazyObject
sini, karena lambda tidak akan dipanggil jika tidak ada yang mengakses 'situs'.SimpleLazyObject
, masingRequestContext
- masing akan memanggilget_current_site()
, dan karenanya menjalankan query SQL. Wrapper memastikan variabel hanya dievaluasi ketika sebenarnya digunakan dalam template.SimpleLazyObject
ada untuk menghindari reevaluasi fungsi, yang tidak benar-benar diperlukan karenaSite
objek cache.from django.contrib.sites.shortcuts import get_current_site
Saya tahu pertanyaan ini sudah lama, tetapi saya menemukan itu mencari cara pythonic untuk mendapatkan domain saat ini.
sumber
build_absolute_uri
didokumentasikan di sini .Cepat dan sederhana, tetapi tidak baik untuk produksi:
(dalam tampilan)
(dalam templat)
Pastikan untuk menggunakan RequestContext , yang merupakan kasus jika Anda menggunakan render .
Jangan percaya
request.META['HTTP_HOST']
pada produksi: info itu berasal dari browser. Sebagai gantinya, gunakan jawaban @ CarlMeyersumber
request.scheme
. Mungkin hanya tersedia di Django versi terbaru.request.scheme
ditambahkan dalam Django 1.7.{{ request.get_host }}
harus melindungi terhadap serangan header HTTP Host ketika digunakan bersama-sama denganALLOWED_HOSTS
pengaturan (ditambahkan dalam Django 1.4.4).Perhatikan bahwa
{{ request.META.HTTP_HOST }}
tidak memiliki perlindungan yang sama. Lihat dokumen :Adapun untuk menggunakan
request
dalam template Anda, panggilan fungsi rendering template telah berubah di Django 1.8 , sehingga Anda tidak perlu lagi menanganiRequestContext
secara langsung.Berikut cara merender templat untuk tampilan, menggunakan fungsi pintasan
render()
:Berikut cara merender templat untuk email, IMO mana yang merupakan kasus paling umum di mana Anda menginginkan nilai host:
Berikut ini contoh menambahkan URL lengkap dalam templat email; request.scheme harus mendapatkan
http
atauhttps
bergantung pada apa yang Anda gunakan:sumber
Saya menggunakan tag templat khusus. Tambahkan ke misalnya
<your_app>/templatetags/site.py
:Gunakan dalam template seperti ini:
sumber
get_current
adalah metode yang terdokumentasi: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'
bisa menjadi masalah dalam halhttps
koneksi; Skema tidak dinamis dalam hal ini.Mirip dengan balasan pengguna panchicore, ini adalah apa yang saya lakukan di situs web yang sangat sederhana. Ini memberikan beberapa variabel dan membuatnya tersedia di templat.
SITE_URL
akan memegang nilai sukaexample.com
SITE_PROTOCOL
akan memegang nilai sukahttp
atauhttps
SITE_PROTOCOL_URL
akan memegang nilai sukahttp://example.com
atauhttps://example.com
SITE_PROTOCOL_RELATIVE_URL
akan memegang nilai suka//example.com
.module / context_processors.py
settings.py
Kemudian, pada template Anda, menggunakannya sebagai
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
dan{{ SITE_PROTOCOL_RELATIVE_URL }}
sumber
Dalam template Django yang dapat Anda lakukan:
sumber
django.template.context_processors.request
juga [ini bagaimana-untuk membantu] ( simpleisbetterthancomplex.com/tips/2016/07/20/ ... )Jika Anda menggunakan pemroses konteks "permintaan" , dan sedang menggunakan kerangka kerja situs Django , dan instal middleware Situs (mis. Pengaturan Anda mencakup ini):
... maka Anda akan memiliki
request
objek yang tersedia di template, dan itu akan berisi referensi keSite
permintaan saat ini sebagairequest.site
. Anda kemudian dapat mengambil domain dalam templat dengan:sumber
Bagaimana dengan pendekatan ini? Bekerja untukku. Ini juga digunakan dalam pendaftaran Django .
sumber
localhost
akan membuat Andahttps
skema (Itu dianggap aman) yang tidak akan berfungsi jika Anda punya url statis (hanyahttp://127.0.0.1
valid, tidakhttps://127.0.0.1
). Jadi tidak ideal saat masih dalam pengembangan.sumber
Anda dapat menggunakan
{{ protocol }}://{{ domain }}
template Anda untuk mendapatkan nama domain Anda.sumber