Я написал небольшое приложение на Flask и пытаюсь заставить его работать на сервере Linode. Но в настоящее время, если я ввожу IP-адрес сервера в свой браузер, я получаю список файлов.
У меня установлен python не в virtualenv (в настоящее время), проверено, работает.
В основном я следовал этому руководству: https://www.digitalocean.com/community/articles/how-to-deploy-a-flask-application-on-an-ubuntu-vps
Моя структура приложения такова (верхняя папка находится в / var / www /):
|--mythmuff/
|----mythmuff/
|------__init__.py
|------app.db
|------config.py
|------models.py
|------templates/
|--------index.html
|------views.py
|--mythmuff.wsgi
Вот мой init .py:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.mail import Mail
import os
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'app.db')
# app email settings go here
mail = Mail(app)
db = SQLAlchemy(app)
import views
import models
Вот мой Mythmuff.wsgi:
import sys
sys.path.insert(0, '/var/www/mythmuff')
from mythmuff import app as application
А вот мой /etc/apache2/sites-available/mythmuff.ru.conf (я «указал» Apache на файл).
<VirtualHost *:80>
ServerName mythmuff.ru
WSGIDaemonProcess mythmuff user=www-data group=www-data threads=5
WSGIScriptAlias / /var/www/mythmuff/mythmuff.wsgi
<Directory var/www/mythmuff/mythmuff>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/mythmuff/mythmuff/static
<Directory /var/www/mythmuff/mythmuff/static>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
</VirtualHost>
Я новичок в настройке Apache / wsgi, но я думаю, что когда я перехожу на IP-адрес и получаю только список файлов и папок в каталоге / var / www /, значит, что я где-то отсутствует app.run()
. Я пробовал добавить это в __init__.py
:
if __name__ == "__main__":
app.run()
Но я получаю сообщение об ошибке при запуске __init__.py
на домашнем компьютере:
File "/Users/georgeoblapenko/Dropbox/University/Python/flask/MythMuff/mythmuff/mythmuff/__init__.py", line 18, in <module>
import views
File "/Users/georgeoblapenko/Dropbox/University/Python/flask/MythMuff/mythmuff/mythmuff/views.py", line 5, in <module>
from models import Product
File "/Users/georgeoblapenko/Dropbox/University/Python/flask/MythMuff/mythmuff/mythmuff/models.py", line 6, in <module>
class Product(db.Model):
File "/Users/georgeoblapenko/anaconda/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 510, in __init__
DeclarativeMeta.__init__(self, name, bases, d)
File "/Users/georgeoblapenko/anaconda/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 53, in __init__
_as_declarative(cls, classname, cls.__dict__)
File "/Users/georgeoblapenko/anaconda/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 246, in _as_declarative
**table_kw)
File "/Users/georgeoblapenko/anaconda/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 342, in __new__
"existing Table object." % key)
sqlalchemy.exc.InvalidRequestError: Table 'product' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
Дома я запустил сценарий runserver.py из верхней папки Mythmuff для тестирования (как описано здесь: http://flask.pocoo.org/docs/patterns/packages/).
Итак, что мне нужно добавить, чтобы все это работало?
Обновление: я решил запустить простой тест wsgi hello world. Итак, я заменил все в файле migmuff.wsgi на
import os
import sys
sys.path.append('/var/www/mythmuff/mythmuff')
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Однако я все еще получаю список файлов / папок вместо «Hello World!» страница. Похоже, что по какой-то причине запрос не передается в WSGI.