2009-11-23 27 views
11

Nếu tôi muốn cung cấp tùy chọn cho người dùng đăng nhập vào trang web bằng cách sử dụng https:// thay vì http://, tôi nên cung cấp cho họ tùy chọn để đến đó trong chế độ xem hoặc mẫu của tôi.Django - liên kết được tạo với {% url%} - cách làm cho chúng an toàn?

Tôi muốn có liên kết "Sử dụng kết nối an toàn" trên trang đăng nhập của mình - nhưng sau đó, làm cách nào để thực hiện điều đó mà không cần mã hóa cứng URL?

Tôi muốn có thể chỉ cần làm:

{% url login_page %} 
{% url login_page_https %} 

và có chúng trỏ đến http://example.com/loginhttps://example.com/login.

Tôi làm cách nào để thực hiện việc này?

+0

Tò mò mặc dù, tại sao bất cứ người dùng muốn đăng nhập qua một http khi https có sẵn không? – Randell

+1

Vì proxy của chúng chỉ cho phép cổng 80 thông qua (nhìn thấy quang sai này một vài lần) – Kos

Trả lời

0

Có lẽ bạn có thể viết thẻ url_https thực hiện tương tự như url nhưng trỏ đến phiên bản HTTPS của url.

6

Tôi đã không làm việc nhiều với các url an toàn, nhưng tôi đã làm việc một chút với satchmo, trong đó có một middleware và một số utils cho nó. Phần mềm trung gian chỉ kiểm tra khóa SSL = True trong thông số chế độ xem và yêu cầu bảo mật theo cách đó. Bạn có thể không cần phải làm cho nó phức tạp, nhưng bạn có thể xem nó được triển khai như thế nào.

Satchmo được trên bitbucked here

Tôi cũng đã có thể tìm thấy một đoạn cho middlewares mà cũng sẽ có thể giúp bạn có được một url đăng nhập an toàn:

Đầu tiên là bản gốc, trong khi phiên bản thứ 2 phải là phiên bản cải tiến ab, tại một số thời điểm, nhưng có thể không còn là trường hợp nữa. Bạn có thể nhìn vào chúng.

Sử dụng một trong hai Satchmo hoặc một trong các đoạn trung gian bạn sẽ có thể làm điều gì đó như

{% url login_page %} 
{% url login_page SSL=1 %} 
+0

Đoạn mã được liên kết là giải pháp toàn diện tốt nếu bạn muốn xác định một số URL nhất định là https và sau đó có phần mềm trung gian xử lý nó. Chúng quá mức cần thiết nếu tất cả những gì bạn đang cố gắng làm là tạo một liên kết https. –

+0

Đúng, đối với một liên kết một mình điều này là không có giá trị nó. Trong trường hợp đó giải pháp của bạn tốt hơn. – googletorp

18

Thẻ {% url %} chỉ tạo ra một phần đường dẫn URL, không phải là phần host. Nó chỉ tạo ra một cái gì đó như "/ path/to/here" (tất cả những gì bạn cần làm là "xem nguồn" và bạn sẽ thấy đó là toàn bộ nội dung của href). Trình duyệt của bạn giả định rằng bạn hiện đang ở trên http://example.com liên kết cũng phải nằm trong phạm vi http://example.com. Vì vậy, tất cả các bạn cần phải làm gì để tạo ra một liên kết an toàn trong mẫu của bạn là:

<a href="https://example.com{% url blah %}"> 

Nếu bạn không muốn hardcode tên miền (và tôi sẽ không), bạn có thể sử dụng the Site object và có nó trông cái gì đó như:

<a href="https://{{ site.domain }}{% url blah %}"> 

Hoặc nếu bạn không muốn sử dụng khuôn khổ trang web, bạn có thể sử dụng request.get_host:

<a href="https://{{ request.get_host }}{% url blah %}"> 
+0

Điều này có 1 bất lợi mặc dù; khi/nếu tôi di chuyển trang web sang miền khác, hoặc tương tự như vậy, các URL tương đối sẽ không bị hỏng, điều này sẽ xảy ra. Tôi đã tìm kiếm một cái gì đó giống như request.build_absolute_uri() chức năng với các tùy chọn để thay thế http với https, nhưng tôi đoán nó tốt hơn để thực hiện nó một mình. – kender

+0

Vâng, không có cách nào để buộc https và sử dụng URL tương đối. Đã chỉnh sửa đề cập đến việc bạn có thể sử dụng khuôn khổ Trang web để tránh mã hóa cứng tên miền. –

+0

Tùy chọn ở trên bằng cách sử dụng request.get_host về cơ bản là thực hiện tương tự như request.get_absolute_uri và buộc https. –

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