繁体   English   中英

当通过符号链接访问文件时,如何让我的 Django manage.py 正常工作?

[英]How do I get my Django manage.py working properly when the files are accessed through a symlink?

问题

尝试运行我的自定义 Django 管理命令之一( send_notify_emails )时,出现以下错误:

$ python web_apps/manage.py send_notify_emails
Traceback (most recent call last):
  File "web_apps/manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 436, in execute_manager
    setup_environ(settings_mod)
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 419, in setup_environ
    project_module = import_module(project_name)
  File "/usr/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named my_django_app-1.0

背景

我有一个 Django 站点,其中包含两个应用程序。 站点目录(包括应用程序模块目录,以及 settings.py、urls.py 和 manage.py)的路径是/srv/web_apps 这是指向/usr/share/my_django_app-1.0的符号链接,它是生产版本标签的svn export 这样,我只需将符号链接移动到新生产版本的路径,就可以更改我的应用程序版本,并在需要时轻松更改回早期版本。

我的django.wsgi文件将/srv/srv/web_apps到 Python 路径,以便mod_wsgi可以找到我的设置和 url 文件以及应用程序文件。

my_django_app-1.0出现的唯一位置是目录路径,它不在我的settings.py或其他任何地方,因此 Django 必须从路径中获取模块名称。

似乎正在发生的事情是 Django 正在通过遵循符号链接并使用目标文件夹的名称而不是符号链接本身来解析我的应用程序的 package 名称。 当我运行manage.py时, Django 在应该导入web_apps时尝试导入my_django_app-1.0

我有一个 Django 站点,其中包含两个应用程序。 站点目录(包括应用程序模块目录,以及 settings.py、urls.py 和 manage.py)的路径是 /srv/web_apps。 这是指向 /usr/share/my_django_app-1.0 的符号链接,它是生产版本标签的 svn 导出。 这样,我只需将符号链接移动到新生产版本的路径,就可以更改我的应用程序版本,并在需要时轻松更改回早期版本。

您所描述的基本上就是人们如此喜欢 virtualenv 的确切原因。 我建议通读mod_wsgi Virtual Environments

问题是__file__返回符号链接的相对路径,这取决于它是从哪里导入的(在符号链接路径内..),这就是它如何报告它的家。 由于目录是模块的基本结构,因此如果您有一个包含__init__.py的目录,那么如果您导入该目录,则该目录的名称将是“名称”。

您可能能够覆盖此行为,但这对于 go 来说是错误的方式 - 检查 virtualenv,或为每个版本设置单独的目录,只使用下划线而不是句点。 myApp_1_0_0

考虑以下场景

mkdir real_directory
ln -s real_directory symlink_directory
cat >>real_directory/__init__.py <<EOF
import os
print
print '__name__ == %s' % (__name__)
print '__file__ == %s' % (__file__)
print ' abspath == %s' % os.path.abspath(__file__)
print 'realpath == %s' % os.path.realpath(os.path.abspath(__file__))
print
EOF

python -c“导入真实目录”

__name__ == real_directory
__file__ == real_directory/__init__.py
 abspath == /Users/nar/pt/real_directory/__init__.py
realpath == /Users/nar/pt/real_directory/__init__.py

python -c“导入符号链接目录”

__name__ == symlink_directory
__file__ == symlink_directory/__init__.pyc
 abspath == /Users/nar/pt/symlink_directory/__init__.pyc
realpath == /Users/nar/pt/real_directory/__init__.pyc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM