Đã cấu hình không đúng cách: Bạn phải xác định biến môi trường DJANGO_SETTINGS_MODULE hoặc gọi settings.configure () trước khi truy cập cài đặt


83

Tôi đang cố gắng định cấu hình dự án django của mình để triển khai cho heroku. Tôi đang gặp lỗi sau và tôi thực sự không biết làm thế nào để khắc phục nó.

Đây là toàn bộ thông tin truy xuất và lỗi:

22:46:15 web.1  | Traceback (most recent call last):
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
22:46:15 web.1  |     worker.init_process()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
22:46:15 web.1  |     self.wsgi = self.app.wsgi()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
22:46:15 web.1  |     self.callable = self.load()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
22:46:15 web.1  |     return self.load_wsgiapp()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
22:46:15 web.1  |     return util.import_app(self.app_uri)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
22:46:15 web.1  |     __import__(module)
22:46:15 web.1  |   File "/Users/nir/nirla/nirla/wsgi.py", line 12, in <module>
22:46:15 web.1  |     from dj_static import Cling
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/dj_static.py", line 7, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.handlers import StaticFilesHandler as DebugHandler
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 8, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.views import serve
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/views.py", line 13, in <module>
22:46:15 web.1  |     from django.views import static
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/views/static.py", line 96, in <module>
22:46:15 web.1  |     template_translatable = ugettext_noop("Index of %(directory)s")
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 65, in gettext_noop
22:46:15 web.1  |     return _trans.gettext_noop(message)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 52, in __getattr__
22:46:15 web.1  |     if settings.USE_I18N:
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
22:46:15 web.1  |     self._setup(name)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
22:46:15 web.1  |     % (desc, ENVIRONMENT_VARIABLE))
22:46:15 web.1  | ImproperlyConfigured: Requested setting USE_I18N, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

Đây là tệp wsgi.py của tôi :

import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings") #nirla is the name of the project


application = Cling(get_wsgi_application())

Và trong trường hợp nó có liên quan, tệp management.py của tôi :

import os
import sys

    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")

        from django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

Có ai có thể hiểu vấn đề ở đây không? Và nếu vậy, bạn có thể tốt bụng để giải thích những gì là sai? Cảm ơn bạn!

Câu trả lời:


82

Tôi nhận ra rằng DJANGO_SETTINGS_MODULE phải được đặt theo cách nào đó, vì vậy tôi đã xem tài liệu (liên kết được cập nhật) và thấy:

export DJANGO_SETTINGS_MODULE=mysite.settings

Mặc dù điều đó là không đủ nếu bạn đang chạy một máy chủ trên heroku, nhưng bạn cũng cần chỉ định nó ở đó. Như thế này:

heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings --account <your account name> 

Trong trường hợp cụ thể của tôi, tôi đã chạy hai cái này và mọi thứ đều hoạt động tốt:

export DJANGO_SETTINGS_MODULE=nirla.settings
heroku config:set DJANGO_SETTINGS_MODULE=nirla.settings --account personal

Biên tập

Tôi cũng muốn chỉ ra rằng bạn phải thực hiện lại việc này mỗi khi đóng hoặc khởi động lại môi trường ảo của mình. Thay vào đó, bạn nên tự động hóa quy trình bằng cách vào venv / bin / active và thêm dòng: set DJANGO_SETTINGS_MODULE=mysite.settingsvào cuối mã. Kể từ bây giờ mỗi khi bạn kích hoạt môi trường ảo, bạn sẽ sử dụng cài đặt của ứng dụng đó.


Vì vậy, os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")được bỏ qua?
Matej J

62

Từ Hướng dẫn Cuối cùng cho Django: Phát triển Web Hoàn thành Đúng :

Nếu bạn đã sử dụng Python trước đây, bạn có thể tự hỏi tại sao chúng tôi đang chạy python manage.py shellthay vì chỉ python. Cả hai lệnh sẽ khởi động trình thông dịch tương tác, nhưng manage.py shelllệnh có một điểm khác biệt chính: trước khi khởi động trình thông dịch, nó sẽ cho Django biết tệp cài đặt nào cần sử dụng.

Trường hợp sử dụng: Nhiều phần của Django, bao gồm cả hệ thống mẫu, dựa vào cài đặt của bạn và bạn sẽ không thể sử dụng chúng trừ khi khung công tác biết cài đặt nào cần sử dụng.

Nếu bạn tò mò, đây là cách nó hoạt động đằng sau hậu trường. Django tìm kiếm một biến môi trường có tên DJANGO_SETTINGS_MODULE, biến này sẽ được đặt thành đường dẫn nhập của settings.py của bạn. Ví dụ: DJANGO_SETTINGS_MODULEcó thể được đặt thành 'mysite.settings', giả sử mysite nằm trên đường dẫn Python của bạn.

Khi bạn chạy python manage.py shell, lệnh sẽ đảm nhận việc thiết lập DJANGO_SETTINGS_MODULEcho bạn. **


2
Cảm ơn vì điều đó. Mặc dù trình bao django gặp lỗi tương tự, nhưng cuối cùng tôi đã giải quyết được điều đó. Tôi đang ở trong một trường hợp cụ thể, trong đó tôi không có settings.pytệp / mô-đun trong cơ sở mã của mình, mà là một settingsgói / thư mục. Gói này chứa một __init__.pytệp với tất cả nội dung thông thường của settings.pyvà các tệp cài đặt cục bộ khác, được nhập trong init . Vì vậy, tôi đã phải cấu hình như sau:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee

Cảm ơn, bình luận của bạn đang sáng tỏ. Tôi đang phát triển một ứng dụng trong Django và tôi đã phát triển một tập lệnh .py để tải dữ liệu từ một trang tính excel vào mô hình. Ở phần đầu của settings.py tôi đã thêm hai dòng mà bạn đề xuất, đó là "từ cài đặt nhập django.conf", "settings.configure ()" .. Nhưng khi tôi chạy, bảng điều khiển của tôi trả về “django.core. ngoại lệ.AppRegistryNotReady: Ứng dụng chưa được tải ”và tôi không hiểu tại sao. Đây là tập lệnh của tôi stackoverflow.com/questions/58305225/…
Tms91

38

Django cần cài đặt dành riêng cho ứng dụng của bạn. Vì nó đã ở bên trong của bạn manage.py, chỉ cần sử dụng nó. Giải pháp nhanh hơn nhưng có lẽ tạm thời là:

python manage.py shell

Đây chính xác là những gì tôi cần khi xem qua Hướng dẫn Django 2.0 - Phần 5 - Kiểm tra tự động . Trước đây, tôi đã vào chế độ tương tác Python trong môi trường của pythonmình bằng cách gõ một mình. Điều này sẽ dẫn đến một ngoại lệ AppRegistryNotReady sau khi nhập from polls.models import Question.
datalifenyc

6

Trong trường hợp của tôi, chính việc sử dụng call_commandmô-đun đã gây ra vấn đề.
Tôi đã thêm set DJANGO_SETTINGS_MODULE=mysite.settingsnhưng nó không hoạt động.

Cuối cùng tôi đã tìm thấy nó:

thêm những dòng này ở đầu tập lệnh và thứ tự quan trọng.

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

import django
django.setup()

from django.core.management import call_command

3

Tạo tệp .env sẽ giữ thông tin đăng nhập của bạn ở gốc dự án của bạn và để nó không lập phiên bản:

$ echo ".env" >> .gitignore

Trong tệp .env, hãy thêm các biến (điều chỉnh chúng theo cài đặt của bạn):

$ echo "DJANGO_SETTINGS_MODULE=myproject.settings.production"> .env
#50 caracter random key
$ echo "SECRET_KEY='####'">> .env

Để sử dụng chúng, hãy đặt cái này lên đầu tệp cài đặt production.py của bạn:

import os

env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']

Xuất bản nó lên Heroku bằng cách sử dụng đá quý này: http://github.com/ddollar/heroku-config.git

$ heroku plugins:install git://github.com/ddollar/heroku-config.git
$ heroku config:push

Bằng cách này, bạn tránh thay đổi các tệp virtualenv.

* Dựa trên hướng dẫn này


0

Nếu bạn đang sử dụng máy chủ cục bộ, hãy chạy trình bao Django bằng cách sử dụng python manage.py shell. Nó sẽ đưa bạn đến môi trường trăn Django và bạn đã sẵn sàng.


0

Đảm bảo rằng đường dẫn python được đặt chính xác cho thư mục dự án của bạn.

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.