2016-03-09 21 views
7

Tôi đang sử dụng Django 1.9.3. Tôi có một dự án với một số ứng dụng. Tôi muốn cập nhật các bảng của một trong các ứng dụng khi khởi động dự án.Django - thực thi mã khi khởi động

Sử dụng hợp cụ thể:

Ví dụ, chúng ta hãy nói rằng tôi muốn bán các mặt hàng trên trang web của tôi. Tôi có một ứng dụng chứa Item model. Tôi có một dịch vụ web bên ngoài Django cung cấp dịch vụ "give_all_items_available()". Tôi muốn cung cấp cho người dùng của tôi danh sách các mục sử dụng trang web. Vì vậy, tôi nghĩ rằng tôi phải cập nhật cơ sở dữ liệu của tôi thường xuyên (lúc khởi động và mỗi lần trong một thời gian) với đầu vào dịch vụ web đó.

tôi có tất cả các mã được viết, nó trông giống như sau (đó là một ví dụ):

from my_app.models import My_table 

def on_startup(): 
    my_thread = Thread(execute = populate_tables, loopmode = True, background = True) # thread running in loopmode in background 
    my_thread.start() # starts the thread and returns 

def populate_tables() 
    response = call_webservice() # let's imagine this method returns data for creating a new model instance 
    My_table(response).save() # this save() isn't threadsafe in this example, but that's not my point ;-) 

Vấn đề của tôi là tôi không biết nơi nào để viết mã này

Nỗ lực:

Cho đến nay, với Django 1.6.5, tôi đi kèm với một số mã từ tệp init .py của ứng dụng của tôi. Nó đã được làm việc, nhưng tôi nghĩ rằng nó đã khá xấu xí (bắt đầu một sợi với một "nhập khẩu" trông thực sự giống như mã ẩn).

Tôi đã thấy ở Django 1.9 phương thức "ready()". Nhưng nó được viết trong tài liệu hướng dẫn để không đối phó với các mô hình trong phương pháp này vì vậy tôi bối rối.

Tôi có thể thêm mã khởi động trong lệnh bắt đầu từ máy chủ nhưng mã khởi động này được định hướng ứng dụng và theo ý kiến ​​của tôi, các dự án không liên quan gì đến nó.

Bạn sẽ đề xuất điều gì?

Tôi sẵn lòng cung cấp thêm thông tin nếu cần.

Xin cảm ơn trước,

+1

Bạn có thể tìm thấy điều gì đó hữu ích trong [câu hỏi ngăn xếp ngăn xếp này] (http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code). – Robin

+0

Tôi đã thấy nó, câu trả lời được chấp nhận của liên kết này đề cập đến phương thức "ready()" như tôi. Nhưng theo tài liệu Django, đó là một thực tế xấu để xen kẽ với các mô hình trong phương pháp này ... –

+3

"Khởi động" có nghĩa là gì trong trường hợp này? Thông thường bạn bắt đầu một trang web một lần, và sau đó nó chạy liên tục. Tại sao bạn cần điền các bảng lúc "khởi động", thay vì ví dụ như trong quá trình di chuyển? –

Trả lời

1

Tại sao bạn không sử dụng Celery thay thế? Tôi biết bạn đang hỏi về cách điền bảng mục của bạn khi khởi nghiệp, nhưng ... Tôi nghĩ rằng một nhiệm vụ cần tây theo lịch trình ở đây phù hợp và giải quyết một cách tự nhiên vấn đề của bạn.

+0

Trong khi liên kết này có thể trả lời câu hỏi, nó là tốt hơn để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/11771232) –

+0

@MikeC, tôi đánh giá cao bạn nhận xét, nhưng phần quan trọng của câu trả lời được bao gồm: "một tác vụ theo lịch", tôi cũng bao gồm tên của một trong công cụ chúng ta có thể sử dụng để giải quyết: Celery, liên kết chỉ là một phím tắt cho công cụ này. – trinchet

+1

cũng Cần tây có thể là một lựa chọn, nhưng tôi nghĩ Django cung cấp những cách để làm những gì tôi cần mà không cần phải phụ thuộc vào cần tây. Thật vậy, ngày tôi sẽ sử dụng Celery để cải thiện chương trình của tôi, sau đó tôi sẽ nghĩ về điều đó nhưng tôi không muốn Celery chỉ phụ thuộc vào điều đó. Điều quản lý là những gì tôi cần tôi nghĩ, cho đến nay nó hoạt động –

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