2016-03-16 3 views
0

В настоящее время я развертываю приложение Flask в Heroku, которое представляет собой настраиваемый модуль формы.Как вы импортируете пользовательский модуль с Gunicorn в Procfile при развертывании в Heroku?

Когда я проверяю журналы heroku, он получает ошибку импорта при попытке импортировать регистрационную форму.

2016-03-16T18:40:08.254753+00:00 heroku[web.1]: State changed from crashed to starting 
2016-03-16T18:40:12.022731+00:00 heroku[web.1]: Starting process with command `gunicorn app.register:app` 
2016-03-16T18:40:14.912795+00:00 app[web.1]: [2016-03-16 18:40:14 +0000] [3] [INFO] Starting gunicorn 19.4.5 
2016-03-16T18:40:14.913529+00:00 app[web.1]: [2016-03-16 18:40:14 +0000] [3] [INFO] Listening at: http://0.0.0.0:39309 (3) 
2016-03-16T18:40:14.913654+00:00 app[web.1]: [2016-03-16 18:40:14 +0000] [3] [INFO] Using worker: sync 
2016-03-16T18:40:14.917468+00:00 app[web.1]: [2016-03-16 18:40:14 +0000] [7] [INFO] Booting worker with pid: 7 
2016-03-16T18:40:14.951783+00:00 app[web.1]: [2016-03-16 18:40:14 +0000] [8] [INFO] Booting worker with pid: 8 
2016-03-16T18:40:15.665966+00:00 heroku[web.1]: State changed from starting to up 
2016-03-16T18:40:15.568052+00:00 app[web.1]: [2016-03-16 18:40:15 +0000] [8] [ERROR] Exception in worker process: 
2016-03-16T18:40:15.568074+00:00 app[web.1]: Traceback (most recent call last): 
2016-03-16T18:40:15.568076+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/arbiter.py", line 515, in spawn_worker 
2016-03-16T18:40:15.568076+00:00 app[web.1]:  worker.init_process() 
2016-03-16T18:40:15.568077+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/workers/base.py", line 122, in init_process 
2016-03-16T18:40:15.568078+00:00 app[web.1]:  self.load_wsgi() 
2016-03-16T18:40:15.568078+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/workers/base.py", line 130, in load_wsgi 
2016-03-16T18:40:15.568079+00:00 app[web.1]:  self.wsgi = self.app.wsgi() 
2016-03-16T18:40:15.568080+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi 
2016-03-16T18:40:15.568081+00:00 app[web.1]:  self.callable = self.load() 
2016-03-16T18:40:15.568081+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load 
2016-03-16T18:40:15.568082+00:00 app[web.1]:  return self.load_wsgiapp() 
2016-03-16T18:40:15.568083+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp 
2016-03-16T18:40:15.568083+00:00 app[web.1]:  return util.import_app(self.app_uri) 
2016-03-16T18:40:15.568084+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/gunicorn/util.py", line 357, in import_app 
2016-03-16T18:40:15.568085+00:00 app[web.1]:  __import__(module) 
2016-03-16T18:40:15.568086+00:00 app[web.1]:  from registration_form import RegistrationForm 
2016-03-16T18:40:15.568086+00:00 app[web.1]: File "/app/app/register.py", line 2, in <module> 
2016-03-16T18:40:15.568087+00:00 app[web.1]: ImportError: No module named 'registration_form' 

Это то, что выглядит в каталоге.

app 
├── register.py 
├── registration_form.py 
Procfile 
requirements.txt 
runtime.txt 
virtual 

Это в моем Procfile.

web: gunicorn app.register:app 

Это мое приложение/register.py файл

from flask import Flask, render_template, request 
from registration_form import RegistrationForm 

app = Flask(__name__) 

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    form = RegistrationForm(request.form) 
    #if request.method == 'POST' and form.validate(): 
    return render_template('register.html', form=form) 

if __name__ == '__main__': 
    app.run(debug=True) 

Это мое приложение/registration_form.py файл

from wtforms import Form, BooleanField, TextField, PasswordField, validators 

class RegistrationForm(Form): 
    first_name = TextField('First Name', [validators.Length(min=2, max=25)]) 
    last_name = TextField('Last Name', [validators.Length(min=4, max=35)]) 
    email = TextField('Email', [validators.Email()]) 
    zip_code = TextField('Zip Code', [validators.Length(min=4, max=35)]) 
    accept_tos = BooleanField('I accept the TOS', [validators.Required()]) 

Что я должен добавить к моему PROCFILE импортировать регистрацию форме? Когда я запускаю приложение локально, он работает нормально, поэтому я чувствую, что он имеет какое-то отношение к настройке Gunicorn.

ответ

1

Python 3.x не поддерживает относительный импорт так, как вы их делали. Вам необходимо обновить импорт:

from .registration_form import RegistrationForm 

В качестве альтернативы, вы можете сделать абсолютный импорт:

from app.registration_form import RegistrationForm 
+0

Awesome! Это сделал трюк. Спасибо, что ответили на мой вопрос так быстро –

 Смежные вопросы

  • Нет связанных вопросов^_^