【发布时间】:2020-10-13 07:06:13
【问题描述】:
我错过了什么?这是我第一次尝试使用 Django。内置在 Django 中的服务器可以很好地在本地提供文件,但我不能让 Apache 做同样的事情。以下是我在一个全新的、干净的 Linux 2 实例中所做的事情。
sudo yum update
sudo yum install -y python3
sudo yum install httpd-devel
sudo yum install -y mod_wsgi
cd /etc/httpd/modules (verify that mod_wsgi is there)
cd /var/www/
sudo mkdir myApp
sudo chown ec2-user myApp
cd myApp
sudo pip3 install virtualenv
virtualenv myprojectenv
source myprojectenv/bin/activate
sudo pip3 install django==2.1.1
django-admin startproject myApp
cd myApp
python manage.py migrate
python manage.py runserver
wget http://127.0.0.1:8000/ (works correctly as it should and I receive test page)
python manage.py startapp hello
cd myApp
vim settings.py
settings.py:将此部分编辑为如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello.apps.HelloConfig',
]
.
vim urls.py
urls.py:整个文件如下所示:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('hello.urls')),
]
.
cd ..
cd hello
vim views.py
views.py:整个文件看起来像这样
from django.shortcuts import render
# Create your views here.
# hello/views.py
from django.http import HttpResponse
def homePageView(request):
return HttpResponse('Hello, World!')
.
vim urls.py
hello/urls.py:整个文件如下所示:
# hello/urls.py
from django.urls import path
from .views import homePageView
urlpatterns = [
path('', homePageView, name='home')
]
.
cd ..
python manage.py runserver
wget http://127.0.0.1:8000/ (works correctly as it should, now gets “Hello World!”)
现在是 Apache 部分:
sudo vim /etc/httpd/conf/httpd.conf
将以下内容粘贴到 httpd.conf 的底部:
WSGIScriptAlias / /var/www/myApp/myApp/myApp/wsgi.py
WSGIPythonHome /var/www/myApp/myprojectenv
WSGIPythonPath /var/www/myApp
<Directory /var/www/myApp/myApp/myApp>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
.
sudo service httpd restart
wget http://127.0.0.1
正在连接到 127.0.0.1:80... 已连接。 HTTP 请求已发送,正在等待响应...
这就是它所做的一切,直到它超时。通过浏览器连接到公共 IP 地址做同样的事情;它会连接并坐在那里等待响应。
Apache 错误日志 (/var/log/httpd/error_log) 说:
Django ImportError: No module named site
快速搜索表明这是因为 mod_wsgi 使用的 python 版本与我的虚拟环境不同。我正在使用python3.7
cd /etc/httpd/modules
ldd mod_wsgi.so
输出
linux-vdso.so.1 (0x00007ffd7dec3000)
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fe35815d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe357f3f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe357d3b000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fe357b38000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe3577f8000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe35744d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe358755000)
显然这是一个不同的版本。我已经卸载了它,在python3.7虚拟环境中重新安装了它,但结果是一样的。它仍然说“libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0”。
【问题讨论】:
-
在顶部的第一个代码块中,我必须使用
python3运行 python 命令,例如python3 manage.py migrate- 否则我得到一个语法错误。顺便说一句,这是迄今为止在 Amazon EC2 上的 Apache 中设置 Django 的最佳教程。
标签: python-3.x django apache