Flask 为什么可以';t heroku运行我的烧瓶应用程序。找不到属性应用程序,然后输出错误代码H10
我已经按照如下方式设置了Procfile:Flask 为什么可以';t heroku运行我的烧瓶应用程序。找不到属性应用程序,然后输出错误代码H10,flask,heroku,Flask,Heroku,我已经按照如下方式设置了Procfile:web:gunicorn项目。main:app 文件夹的主要结构是: ├── DocumentTemplates ├── __pycache__ ├── project ├── venv ├── ASLtemplate\ (with\ highlighted\ fields).docx ├── ASLtemplate.docx ├── Procfile └── requirements.txt 包含应用程序文件(init.py)的项目文件夹的文件结构如
web:gunicorn项目。main:app
文件夹的主要结构是:
├── DocumentTemplates
├── __pycache__
├── project
├── venv
├── ASLtemplate\ (with\ highlighted\ fields).docx
├── ASLtemplate.docx
├── Procfile
└── requirements.txt
包含应用程序文件(init.py)的项目文件夹的文件结构如下:
├── ASLtemplate.docx
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── auth.cpython-37.pyc
│ ├── main.cpython-37.pyc
│ └── models.cpython-37.pyc
├── auth.py
├── db.sqlite
├── main.py
├── models.py
├── static
│ └── css
│ └── main.css
└── templates
├── asl.html
├── base.html
├── index.html
├── login.html
├── profile.html
└── signup.html
def create_app():
app = Flask(__name__)
我已经使用venv建立了一个虚拟环境
init.py设置如下:
├── ASLtemplate.docx
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── auth.cpython-37.pyc
│ ├── main.cpython-37.pyc
│ └── models.cpython-37.pyc
├── auth.py
├── db.sqlite
├── main.py
├── models.py
├── static
│ └── css
│ └── main.css
└── templates
├── asl.html
├── base.html
├── index.html
├── login.html
├── profile.html
└── signup.html
def create_app():
app = Flask(__name__)
以下是运行heroku日志的日志--tail:
这是main.py中的代码
from flask_login import login_required, current_user
from . import db
from os import environ
from flask import Flask, render_template, request, send_file, redirect, Blueprint
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, SelectField, IntegerField, TextAreaField
from wtforms.fields.html5 import DateField
from flask_sqlalchemy import SQLAlchemy
from wtforms.validators import DataRequired
from docx import Document
import jinja2
from docxtpl import DocxTemplate
from io import StringIO
import io
from flask_bootstrap import Bootstrap
from flask_pure import Pure
main = Blueprint('main', __name__)
class MyForm(FlaskForm):
client_name=StringField('Client Contact', validators=[DataRequired()])
client_job_title=StringField('Client Contact Job Title', validators=[DataRequired()])
company_name=StringField('Company Name', validators=[DataRequired()])
# client_name_upper=StringField('Client Contact Name Upper Case', validators=[DataRequired()])
address_line_1=StringField('Address Line 1', validators=[DataRequired()])
address_line_2=StringField('Address Line 2', validators=[DataRequired()])
city_county_country=StringField('City, County, Country', validators=[DataRequired()])
postcode=StringField('Post Code', validators=[DataRequired()])
date=DateField('Date', validators=[DataRequired()], format='%Y-%m-%d')
job_number=StringField('Job Number (4 digit)', validators=[DataRequired()])
document_number=StringField('Document number e.g. 001', validators=[DataRequired()])
lead_initials=StringField('Mabbett Lead Initials e.g. KB for Kieran Bruce', validators=[DataRequired()])
supervisor_initials=StringField('Mabbett Supervisor e.g. PY for Paul Young', validators=[DataRequired()])
supervisor_name=StringField('Mabbett Supervisor Name', validators=[DataRequired()])
project_title=StringField('Project Title', validators=[DataRequired()])
lead_name=StringField('Lead Mabbett Name', validators=[DataRequired()])
service_type=StringField('Service Type', validators=[DataRequired()])
company_short=StringField('Company Name Short Hand e.g. WG&S for William Grant & Sons Ltd ', validators=[DataRequired()])
site_location=StringField('Site Location e.g. Girvan', validators=[DataRequired()])
letter_agreement_date=StringField('Date of orginal letter agreement', validators=[DataRequired()])
project_background=TextAreaField('Background', validators=[DataRequired()])
taskA_title=StringField('Task A Title', validators=[DataRequired()])
taskA_scope=TextAreaField('Task A Scope', validators=[DataRequired()])
taskA_professional_fee=StringField('Task A Professional Fee', validators=[DataRequired()])
taskA_reimbursable_fee=StringField('Task A Reimbursable Fee', validators=[DataRequired()])
taskB_title=StringField('Task B Title', validators=[DataRequired()])
taskB_scope=TextAreaField('Task B Scope', validators=[DataRequired()])
taskB_professional_fee=StringField('Task B Professional Fee', validators=[DataRequired()])
taskB_reimbursable_fee=StringField('Task B Reimbursable Fee', validators=[DataRequired()])
taskC_title=StringField('Task C Title', validators=[DataRequired()])
taskC_scope=TextAreaField('Task C Scope', validators=[DataRequired()])
taskC_professional_fee=StringField('Task C Professional Fee', validators=[DataRequired()])
taskC_reimbursable_fee=StringField('Task C Reimbursable Fee', validators=[DataRequired()])
total_professional_fee=StringField('Total Professional Fee', validators=[DataRequired()])
total_reimbursable_fee=StringField('Total Reimbursable Fee', validators=[DataRequired()])
total_budget=StringField('Total Budget', validators=[DataRequired()])
department_lead_name=StringField('Department Lead Name', validators=[DataRequired()])
department_lead_job_title=StringField('Department Lead Job Title', validators=[DataRequired()])
submit = SubmitField('Create your word file')
@main.route('/')
def index():
return render_template('index.html')
@main.route('/profile')
@login_required
def profile():
return render_template('profile.html', name=current_user.name)
@main.route('/asl', methods=('GET', 'POST'))
@login_required
def asl():
# assigns form to the MyForm Class above
form = MyForm()
# assigns values from the form to the values in a dictionary.
if form.is_submitted():
result = request.form
document = DocxTemplate('ASLtemplate.docx')
context = {
'client_name':result['client_name'],
'client_job_title':result['client_job_title'],
'company_name':result['company_name'],
# 'client_name_upper':result['client_name_upper'],
'address_line_1':result['address_line_1'],
'address_line_2':result['address_line_2'],
'city_county_country':result['city_county_country'],
'postcode':result['postcode'],
'date':result['date'],
'job_number':result['job_number'],
'document_number':result['document_number'],
'lead_initials':result['lead_initials'],
'supervisor_initials':result['supervisor_initials'],
'supervisor_name':result['supervisor_name'],
'project_title':result['project_title'],
'lead_name':result['lead_name'],
'service_type':result['service_type'],
'company_short':result['company_short'],
'site_location':result['site_location'],
'letter_agreement_date':result['letter_agreement_date'],
'project_background':result['project_background'],
'taskA_title':result['taskA_title'],
'taskA_scope':result['taskA_scope'],
'taskA_professional_fee':result['taskA_professional_fee'],
'taskA_reimbursable_fee':result['taskA_reimbursable_fee'],
'taskB_title':result['taskB_title'],
'taskB_scope':result['taskB_scope'],
'taskB_professional_fee':result['taskB_professional_fee'],
'taskB_reimbursable_fee':result['taskB_reimbursable_fee'],
'taskC_title':result['taskC_title'],
'taskC_scope':result['taskC_scope'],
'taskC_professional_fee':result['taskC_professional_fee'],
'taskC_reimbursable_fee':result['taskC_reimbursable_fee'],
'total_professional_fee':result['total_professional_fee'],
'total_reimbursable_fee':result['total_reimbursable_fee'],
'total_budget':result['total_budget'],
'department_lead_name':result['department_lead_name'],
'department_lead_job_title':result['department_lead_job_title']
}
# Handles the word templating
document.render(context)
file = io.BytesIO()
document.save(file)
file.seek(0)
return send_file(file, attachment_filename=(result["job_number"]+ ".docx"), as_attachment=True)
# blank form will be rendered when the url is visited. The form is based upon the html in the bsf html file
return render_template('asl.html', form=form)
查看将其指向不存在的project.main.app()
的枪图标。基于以下条件,我相信如果您将调用更改为:
gunicorn "project:create_app()"
如果这不起作用,您必须提供一个“应在指定模块中找到的WSGI可调用文件”()。Hey!查看日志,似乎会有一个错误日志。你能把错误日志的内容添加到你的问题中吗?我现在已经用日志更新了帖子。嘿,这很有帮助。请您也添加
project/uuu init_uuuuuuuuuuupy
和project/main.py
的内容好吗?我现在已经添加了这两个文件中的代码。在这里你可以找到答案