2009-12-03 20 views
19

Ngay bây giờ, nếu tôi muốn kiểm tra xem các trang hiện tại được truy cập thông qua http:// hoặc https://, tôi sẽ sử dụng javascript sau trong mẫu của tôi và viết html từ document.write:Bạn có thể kiểm tra giao thức internet từ mẫu của Django không?

<script type="text/javascript"> 
var protocol = document.location.protocol; 
if (protocol == "http:") 
    document.write("regular"); 
else 
    document.write("secured"); 
</script> 

Có một cách khác để đạt được ở trên trong mẫu của Django mà không sử dụng Javascript?

+1

nếu bạn chỉ cố gắng tránh nội dung hỗn hợp http/https trong các trang được tạo bằng django, bạn có thể xem xét sử dụng URL tương đối của giao thức như src = "// ajax.googleapis.com/ajax/libs/jquery/1.8 .2/jquery.min.js ". – jnichols959

Trả lời

40

nếu bạn sử dụng một RequestContext, bạn có thể làm như sau:

<p>You used: {% if request.is_secure %}HTTPS{% else %}HTTP{% endif %} 

Xem relevant part của tài liệu Django.

+3

bạn sẽ có thể sử dụng: HTTP {% if request.is_secure%} S {% endif%}: // {{request.get_host}} là một tùy chọn ngắn hơn để có được url cơ sở hoàn chỉnh. – Fydo

+1

Nếu bạn muốn URL cơ sở khớp với giao thức hiện tại của mình, bạn không nên cố gắng chuyển đổi thủ công, nhưng chỉ cần sử dụng '// máy chủ lưu trữ.com/path' Điều này sẽ kết nối qua https khi kết nối hiện tại được bảo mật và thông qua http khi không kết nối. – jcdyer

9

Bạn cần phải bật bộ vi xử lý yêu cầu bối cảnh thích hợp trong tập tin setting.py của bạn:

TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',) 

Mẫu bây giờ sẽ có một biến tên là yêu cầu có chứa các hiện HttpRequest. Bạn có thể sử dụng nó để tìm giao thức:

{{ request.is_secure }} 
2

Hãy thử sử dụng RequestContext và request.is_secure trong mẫu của bạn.

Một lưu ý trước, quá trình phát hiện HTTPS có thể khác với thiết lập máy chủ sang máy chủ tiếp theo, do đó bạn có thể phải thực hiện một công việc nhỏ để có được request.is_secure hoạt động. Bạn có thể làm cho nó hoạt động hoặc bằng cách đảm bảo rằng front end/reverse proxy của bạn đặt 'HTTP_X_FORWARDED_HOST' hoặc bằng cách viết một lớp middleware tùy chỉnh thiết lập của bạn.

Sử dụng [1] SetRemoteAddrFromForwardedFor code [2] đã được sửa [2] làm điểm bắt đầu, nếu bạn đi tuyến đường middleware tùy chỉnh.

(tôi chỉ cho phép 1 liên kết cho mỗi bài vì vậy hãy tha các liên kết sai lầm)

[1]: docs.djangoproject.com/en/dev/releases/1.1/#id1 "Django ghi chú phát hành 1.1 - Removed SetRemoteAddrFromForwardedFor middleware"

[2]: code.djangoproject.com/browser/django/trunk/django/middleware/http.py?rev=11000#L33 "SetRemoteAddrFromForwardedFor"

9

Kể từ Django 1.10, bạn có thể sử dụng:

request.scheme 

trong một cái nhìn, hoặc trong một mẫu:

{{ request.scheme }} 

Từ the docs

Một chuỗi đại diện cho chương trình được yêu cầu (http hoặc https thường).

+2

Hi slavugan; hãy nhớ rằng bạn đang trả lời một câu hỏi cũ, vì vậy tác giả của câu hỏi ban đầu có lẽ đã từ lâu đã giải quyết được vấn đề của họ theo cách này hay cách khác. Đối với câu trả lời của bạn là hữu ích, nó phải là một câu trả lời tốt cho các độc giả khác đang tìm kiếm trang web cho các giải pháp cho các vấn đề tương tự; vì vậy tôi khuyên bạn nên thêm nhiều giải thích và chi tiết hơn, có lẽ với các liên kết đến tài liệu chính thức, để thực sự biện minh cho lý do tại sao kỹ thuật này là giải pháp tốt nhất cho loại vấn đề này. –

+0

cảm ơn lời khuyên, đã thêm liên kết vào tài liệu – slavugan

Các vấn đề liên quan