2009-07-04 23 views
10

Tôi muốn làm điều gì đó sau khi tôi đã trả lại quan điểm sử dụngLàm thế nào để bạn làm điều gì đó sau khi bạn hiển thị chế độ xem? (Django)

return render_to_response() 

Are tín hiệu cách duy nhất để làm điều này? Tôi có cần phải viết một tín hiệu tùy chỉnh hoặc request_finished cho tôi đủ thông tin? Về cơ bản tôi cần phải biết trang nào đã được hiển thị và sau đó thực hiện một hành động để phản hồi điều đó.

Cảm ơn.

CẬP NHẬT TỪ Ý KIẾN: Tôi không muốn giữ lại hiển thị của trang, vì vậy tôi muốn hiển thị trang đầu tiên và sau đó thực hiện hành động.

+2

Điều đó có vẻ lạc hậu. Bạn biết trang bạn sắp render. Chỉ cần thực hiện hành động. Tại sao bạn không thể chèn thêm hành động trong chức năng xem? Vui lòng cung cấp một số gợi ý về những gì bạn đang cố gắng làm. –

+1

i dont 'muốn giữ lại hiển thị trang, vì vậy tôi muốn hiển thị trang đầu tiên và sau đó thực hiện hành động – rick

+0

@rick: Vui lòng không nhận xét về câu hỏi của riêng bạn, vui lòng cập nhật câu hỏi của bạn với thông tin bổ sung. –

Trả lời

-1

Khi trả lời, bạn chuyển trang html mà bạn muốn hiển thị. Trang khác cần phải gửi một bài đăng (thông qua Javascript hoặc một cái gì đó) mà kích hoạt chức năng chính xác trong quan điểm của bạn, sau đó xem đó gọi chính xác trang tiếp theo sẽ được hiển thị.

+0

vâng điều đó sẽ hiệu quả, nhưng tôi tự hỏi nếu có một cách để làm điều đó chỉ ở phía máy chủ – rick

+0

Tôi không chắc chắn điều đó thực sự có thể:/ – AlbertoPL

+0

chắc chắn không thể thực hiện phía máy chủ. Máy chủ không biết bất cứ điều gì về những gì khách hàng đang làm, do đó, nó sẽ không bao giờ biết rằng trang đã kết thúc hiển thị. tất nhiên, một bài viết đơn giản sẽ giải quyết vấn đề đó. – geowa4

4

Nếu bạn có quy trình chạy dài, bạn có hai lựa chọn đơn giản.

  1. Tạo ra một tiến trình con trước khi gửi trang phản hồi.

  2. Tạo "trình nền dịch vụ nền" và chuyển yêu cầu công việc tới nó.

Đây là tất cả bên ngoài Django. Bạn sử dụng subprocess hoặc một số phương thức IPC khác để giao tiếp với quy trình khác.

+1

Đồng ý - Tôi sẽ sử dụng một số loại IPC để làm cho mô-đun trung tính và máy chủ web này. Bạn có thể không muốn hack trên Django internals để làm những việc sau khi phản ứng được gửi đi. – cdleary

4

Cách thông thường để thực hiện việc này là sử dụng hàng đợi tin nhắn. Bạn đặt một tin nhắn trên hàng đợi, và các chủ đề công nhân (hoặc các tiến trình, vv) tiêu thụ hàng đợi và thực hiện công việc sau khi xem xong.

Google App Engine có hàng đợi công việc api http://code.google.com/appengine/docs/python/taskqueue/, amazon có Dịch vụ xếp hàng đơn giản http://aws.amazon.com/sqs/.

Tìm kiếm nhanh không bật bất kỳ thiết bị cắm nhạc django nào giống như tiêu chuẩn được chấp nhận.

Cách nhanh chóng và dơ bẩn để mô phỏng chức năng là đặt 'thông báo' trong bảng cơ sở dữ liệu và có công việc định kỳ kiểm tra bảng để thực hiện công việc.

+0

+1 Một ý tưởng thậm chí còn hiệu quả hơn (hy vọng) các tin nhắn IPC nhẹ. – cdleary

+0

Dịch vụ xếp hàng cụ thể Django http://code.google.com/p/django-queue-service/ – agiliq

4

đối tượng HttpResponse của Django chấp nhận một iterator trong constructor của nó:

http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

Vì vậy, bạn có thể làm điều gì đó như:

def myiter(): 
    yield "my content" 
    enqueue_some_task() 
    return 

def myview(request): 
    return HttpResponse(myiter()) 

Việc sử dụng bình thường của một iterator là để gửi dữ liệu lớn mà không cần đọc tất cả vào bộ nhớ. Ví dụ, đọc khối từ một tập tin và sản lượng một cách thích hợp. Tôi chưa bao giờ sử dụng nó theo cách này, nhưng có vẻ như nó sẽ hoạt động.

+1

Thật không may, điều này sẽ làm cho trang có vẻ vẫn đang tải ở phía máy khách sau khi nó đã được tải đầy đủ, vì máy chủ không đóng kết nối cho đến khi kết quả cuối cùng được mang lại. – dionyziz

2

Giải pháp yêu thích của tôi: Một quy trình riêng xử lý các tác vụ nền, thường là những thứ như lập chỉ mục và gửi thư thông báo, v.v. Django có một cái được xây dựng, nhưng bạn luôn cần một cái, vì vậy bạn nên có một cái) và hệ thống thậm chí sẽ đặt một thông báo trong hàng đợi thông điệp (không quan trọng để viết trừ khi bạn có nhiều máy hoặc nhiều quy trình nền). trong câu hỏi.

10

Bạn sinh ra một chuỗi riêng biệt và thực hiện hành động.

t = threading.Thread(target=do_my_action, args=[my_argument]) 
# We want the program to wait on this thread before shutting down. 
t.setDaemon(False) 
t.start() 

Điều này sẽ khiến 'do_my_action (my_argument)' được thực thi trong chuỗi thứ hai sẽ tiếp tục hoạt động ngay cả sau khi bạn gửi phản hồi Django và chấm dứt chuỗi ban đầu. Ví dụ: nó có thể gửi email mà không trì hoãn phản hồi.

+1

Một giải pháp đơn giản, hoạt động! –

+0

Tôi đã thử triển khai này. Rõ ràng, luồng thứ hai được khởi chạy chấm dứt ngay cả khi nhiệm vụ của nó chưa được thực hiện. Trong trường hợp của tôi, nó đang cập nhật một số mục nhập DB – jaysonpryde

0

Có lẽ tôi không hiểu câu hỏi của bạn. Nhưng tại sao không phải một cái gì đó đơn giản như:

try: 
    return render_to_response() 
finally: 
    do_what_needs_to_be_done() 
+0

Khi nó được trả lại, chế độ xem sẽ được hiển thị đúng không? Bất kể những gì đang xảy ra trong phần cuối cùng? Nếu có, đây chỉ là những gì tôi cần! – rick

+0

có vẻ như nó không hoạt động. hiển thị được giữ lên trong khi mã cuối cùng đang chạy. – rick

+2

Khi có một mệnh đề cuối cùng, sự trở lại của hàm chỉ xảy ra _after_ mã cuối cùng được thực hiện, do đó, điều này sẽ không hoạt động như dự định. – rslite

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