Django Cookies, làm cách nào để đặt chúng?


123

Tôi có một trang web hiển thị nội dung khác nhau dựa trên vị trí mà khách truy cập chọn. ví dụ: Người dùng nhập vào 55812 dưới dạng zip. Tôi biết vĩ độ / kinh độ của thành phố và khu vực nào. nghĩa là và cung cấp cho họ nội dung của họ phù hợp với lĩnh vực đó. Câu hỏi của tôi là làm thế nào tôi có thể lưu trữ thông tin này trong một cookie để khi họ trả lại, họ không phải luôn nhập mã zip của mình?

Tôi thấy nó như sau:

  1. Đặt cookie liên tục dựa trên khu vực của chúng.
  2. Khi họ trả lại cookie đã đọc, hãy lấy mã zip.
  3. Trả lại nội dung dựa trên mã zip trong cookie của họ.

Tôi dường như không thể tìm thấy bất kỳ thông tin chắc chắn nào về việc đặt cookie. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.


Những người đang tìm kiếm thiết lập a cookierendering a templatecùng nhau, hãy xem câu trả lời này .
TheGuardener

Câu trả lời:


66

CẬP NHẬT : kiểm tra câu trả lời của Peter bên dưới để biết giải pháp tích hợp:

Đây là một trình trợ giúp để đặt một cookie liên tục:

import datetime

def set_cookie(response, key, value, days_expire = 7):
  if days_expire is None:
    max_age = 365 * 24 * 60 * 60  #one year
  else:
    max_age = days_expire * 24 * 60 * 60 
  expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
  response.set_cookie(key, value, max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, secure=settings.SESSION_COOKIE_SECURE or None)

Sử dụng mã sau trước khi gửi phản hồi.

def view(request):
  response = HttpResponse("hello")
  set_cookie(response, 'name', 'jujule')
  return response

CẬP NHẬT : kiểm tra câu trả lời của Peter bên dưới để biết giải pháp tích hợp:


bất kỳ sự cố nào nếu cài đặt.SESSION_COOKIE_DOMAIN chưa được đặt?
panchicore

1
dù sao thì bản thân django cũng đặt SESSION_COOKIE_DOMAIN mặc định. hãy nghĩ về cài đặt này nếu bạn cần chia sẻ cookie trên nhiều miền phụ.
jujule

12
-1 về điều đó, django đi kèm với một phương thức để đặt cookie docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: vâng và cuối cùng tôi gọi phương thức django trong ví dụ của mình; nó chỉ là một phím tắt (từ năm 2009) giúp đơn giản hóa việc xử lý ngày tháng.
sáu

5
tôi không quan tâm nhưng, fyi: chức năng trợ giúp vô dụng đã vô dụng vào năm 2009. docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0 được phát hành vào năm 2008, theo như tôi biết)
fetzig

259

Sử dụng khuôn khổ phiên của Django sẽ bao gồm hầu hết các tình huống, nhưng Django hiện cũng cung cấp các phương thức thao tác cookie trực tiếp trên các đối tượng yêu cầu và phản hồi (vì vậy bạn không cần hàm trợ giúp).

Đặt cookie:

def view(request):
  response = HttpResponse('blah')
  response.set_cookie('cookie_name', 'cookie_value')

Lấy một cookie:

def view(request):
  value = request.COOKIES.get('cookie_name')
  if value is None:
    # Cookie is not set

  # OR

  try:
    value = request.COOKIES['cookie_name']
  except KeyError:
    # Cookie is not set

10
Chỉ cần cập nhật - 'has_key' đã được thay thế bằng 'in'.
skaz

15
Một cách khó hiểu hơn sẽ là gọi request.COOKIES.get ('cookie_name')
Charlesthk

hãy để tôi hỏi bạn một câu hỏi ngớ ngẩn, cookie này vẫn tồn tại giữa các phiên sử dụng khác?
Diego Vinícius

Không có gì có giá trị để thêm ở đây, nhưng khi các giải pháp khung tồn tại, thường tốt hơn là sử dụng chúng hơn là sử dụng các chức năng trợ giúp tùy chỉnh cho công việc, đặc biệt nếu không có lý do chính đáng để không làm điều đó. Những giải pháp này có thể không có sẵn lúc đầu nhưng chắc chắn là có, vậy tại sao bạn không sử dụng chúng? Nó tạo ra một mã đơn giản hơn và có thể xử lý nhiều trường hợp hơn những gì người trợ giúp tùy chỉnh của chúng tôi sẽ nghĩ về việc xử lý, bản thân nó là một lập luận tốt theo quan điểm của tôi.
vincent-lg

2
Nếu bạn đang tự hỏi làm thế nào để tạo ra một đối tượng phản ứng Django từ một đối tượng yêu cầu Django, đọc: stackoverflow.com/questions/17057536/...
critikaster

19

Bạn có thể đặt cookie theo cách thủ công, nhưng tùy thuộc vào trường hợp sử dụng của bạn (và nếu bạn có thể muốn thêm nhiều loại dữ liệu liên tục / phiên hơn trong tương lai) thì việc sử dụng tính năng phiên của Django có thể hợp lý hơn . Điều này sẽ cho phép bạn lấy và đặt các biến được liên kết nội bộ với cookie phiên của người dùng. Điều thú vị về điều này là nếu bạn muốn lưu trữ nhiều dữ liệu gắn liền với phiên của người dùng, việc lưu trữ tất cả trong cookie sẽ tạo thêm sức nặng cho các yêu cầu và phản hồi HTTP. Với các phiên, cookie phiên là tất cả những gì được gửi qua lại (mặc dù có chi phí lưu trữ dữ liệu phiên cuối cùng của Django cần lưu ý).


4
Điểm tốt! Một lưu ý, bạn có thể giảm trọng lượng HTTP bằng cách lưu trữ nội dung tĩnh trên một miền riêng biệt (không phải miền phụ) để cookie không được gửi theo các yêu cầu đó. stackoverflow.com/questions/72394/…
John Paulett,

Nhận xét của @ JohnPaulett đã lỗi thời do sự tồn tại của khuôn khổ Django Sessions. Sẽ không còn cần phải giảm thiểu tổng dung lượng lưu trữ dữ liệu trên quy trình làm việc dựa trên cookie.
Chris Conlan

0

Bất kỳ ai quan tâm đến việc này nên đọc tài liệu của khung Django Sessions . Nó lưu trữ một ID phiên trong cookie của người dùng, nhưng ánh xạ tất cả dữ liệu giống cookie vào cơ sở dữ liệu của bạn. Đây là một cải tiến đối với quy trình làm việc dựa trên cookie điển hình cho các yêu cầu HTTP.

Đây là một ví dụ với chế độ xem Django ...

def homepage(request):

    request.session.setdefault('how_many_visits', 0)
    request.session['how_many_visits'] += 1

    print(request.session['how_many_visits'])

    return render(request, 'home.html', {})

Nếu bạn tiếp tục truy cập trang nhiều lần, bạn sẽ thấy giá trị bắt đầu tăng từ 1 cho đến khi bạn xóa cookie, truy cập trên trình duyệt mới, truy cập ẩn danh hoặc làm bất kỳ điều gì khác vượt qua cookie Session ID của Django.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.