2009-07-05 55 views
6

Tôi có cơ sở dữ liệu mysql làm công cụ cho django. Django hoạt động nghĩ nginx qua fastcgi với thời gian chờ trong 1 phút (sau đó nginx nói "504 gateway time-out").Cách đặt thời gian chờ cho kết nối cơ sở dữ liệu trong django

Nếu cơ sở dữ liệu bị hỏng, django đang thử kết nối lại với DB và chờ phản hồi từ đó. Và chờ đợi phản hồi quá lâu (hơn 1 phút) nginx trả lại cho khách hàng mã lỗi 504.

Cách đặt thời gian chờ cho kết nối db trong django? Và cách nào đúng để xử lý sự kiện này và trả lại cho khách hàng một trang đẹp với "Cơ sở dữ liệu xin lỗi không hoạt động ngay bây giờ. Vui lòng thử lại sau" thay vì trang lỗi kỹ thuật 504?

Trả lời

5

trong settings.py là mệnh đề của từ khóa bổ sung arg được chuyển đến phương thức connect của bất kỳ mô-đun cơ sở dữ liệu nào đang được sử dụng; trên tài liệu MySqlDB trên connect, giá trị connect_timeout, như một câu trả lời khác, thực sự là điều bạn muốn ở đó (trước đây tôi đã sai, và nó thay đổi theo chương trình phụ trợ - ví dụ, nó được viết timeout nếu chương trình phụ trợ của bạn là SQLite) .

Đối với các trang lỗi tùy chỉnh, bạn có thể làm theo lời khuyên trong Django docs về cách viết phần mềm trung gian ngoại lệ của riêng mình (tôi chắc chắn rằng phần mềm trung gian ngoại lệ đơn giản chỉ hiển thị trang tùy chỉnh có thể được tìm thấy trong phần mềm đã đóng góp) cuộn của riêng bạn hơn để tìm kiếm trên web cho mã hiện có và bạn có thể phải tinh chỉnh mã đó ;-).

+0

này một khung cảnh chung mà làm việc với tất cả các cơ sở dữ liệu backends django hỗ trợ là? (Tôi googled và chỉ tìm thấy nó đề cập trong mối quan hệ với SQLAlchemy) – lemonad

+0

không có nó, xấu của tôi - cố định bây giờ - lưu ý rằng không có cách duy nhất mà làm việc với tất cả các DBs, nhưng connect_timeout làm việc với MySql, timeout làm việc với SQLite, v.v. (luôn luôn là các khóa trong DATABASE_OPTIONS trong settings.py). –

11

Bạn có thể sử dụng từ điển OPTIONS từ cài đặt DATABASES của mình.

Tên tùy chọn phụ thuộc vào DB phụ trợ của bạn, nhưng đối với PostgreSQL nó sẽ là connect_timeout:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql', 
     … 
     OPTIONS = { 
      'connect_timeout': 5, 
     } 
    } 
} 
+4

'DATABASE_OPTIONS' dường như được thay đổi thành' OPTIONS' kể từ Django 1.2 (https://docs.djangoproject.com/en/1.9/releases/1.2/) – SangminKim

+0

'connect_timeout' cũng có vẻ đã lỗi thời, ít nhất là cho Django1.9 . Chỉ 'thời gian chờ' được chấp nhận, tôi hy vọng đó là sự thay thế chính xác. – zeycus

+0

@zeycus 'connect_timeout' là tùy chọn đúng cho Postgres. psycopg2 2.7.3.2 lỗi với "tùy chọn kết nối không hợp lệ" nếu 'timeout' được sử dụng. Các tài liệu Django chỉ đề cập đến 'timeout' cho người dùng Sqlite. – cdignam

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