我多次在 Heroku 上部署了我的 Flask 应用程序。即使在成功构建后,我的应用程序也没有运行。每当我打开链接时,它总是提示一些应用程序错误。
main.py
from flask import Flask, render_template, request,session,redirect
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail
import json
from werkzeug.utils import secure_filename
from datetime import datetime
import os
import math
with open('config.json', 'r') as c:
params = json.load(c)["params"]
local_server = True
app = Flask(__name__)
app.secret_key = 'key'
app.config['UPLOAD_FOLDER']=params['upload_location']
#app.secret_key = 'super-secret-key'
app.config.update( #for mail updates
MAIL_SERVER = 'smtp.gmail.com',
MAIL_PORT = '465',
MAIL_USE_SSL = True,
MAIL_USERNAME = params['gmail-user'],
MAIL_PASSWORD = params['gmail-password']
)
mail = Mail(app)
if (local_server):
app.config['SQLALCHEMY_DATABASE_URI'] = params['local_uri']
else:
app.config['SQLALCHEMY_DATABASE_URI'] = params['prod_uri']
db = SQLAlchemy(app)
class Contacts(db.Model):
sno = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
phone_num = db.Column(db.String(12), nullable=False)
msg = db.Column(db.String(120), nullable=False)
date = db.Column(db.String(12), nullable=True)
email = db.Column(db.String(20), nullable=False)
class Posts(db.Model):
sno = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), nullable=False)
slug = db.Column(db.String(12), nullable=False)
content = db.Column(db.String(120), nullable=False)
date = db.Column(db.String(12), nullable=True)
tagline = db.Column(db.String(20) , nullable = False)
img_file = db.Column(db.String(12) , nullable = True)
@app.route("/")
def home():
posts = Posts.query.filter_by().all()
last = math.ceil(len(posts)/int(params['no_of_posts']))
page = request.args.get('page')
if(not str(page).isnumeric()):
page = 1
page= int(page)
posts = posts[(page-1)*int(params['no_of_posts']):(page-1)*int(params['no_of_posts']) + int(params['no_of_posts'])]
#Pagination Logic
#when user is on first page
if(page==1):
prev="#"
next = "/?page="+str(page+1)
#when user is on last page
elif(page==last):
prev = "/?page=" + str(page-1)
next = "#"
else:
prev = "/?page=" + str(page - 1)
next = "/?page=" + str(page + 1)
#posts = Posts.query.filter_by().all()[0:params['no_of_posts']]
return render_template('index.html', params = params , posts =posts , prev = prev , next = next )
@app.route("/post/<string:post_slug>",methods = ['GET'])
def post_route(post_slug):
post = Posts.query.filter_by(slug = post_slug).first()
return render_template('post.html',params=params, post=post)
@app.route("/about")
def about():
return render_template('about.html', params=params)
@app.route("/logout")
def logout():
session.pop('user')
return redirect('/dashboard')
@app.route("/contact", methods=['GET', 'POST'])
def contact():
if (request.method == 'POST'):
name = request.form.get('name')
email = request.form.get('email')
phone = request.form.get('phone')
message = request.form.get('message')
entry = Contacts(name=name, phone_num=phone, msg=message, date=datetime.now(), email=email)
db.session.add(entry)
db.session.commit()
mail.send_message('New message from blog',
sender = email,
recipients = [params['gmail-user']],
body = message + "\n" + phone
)
return render_template('contact.html', params=params)
@app.route("/dashboard" , methods = ['GET','POST'])
def dashboard():
if 'user' in session and session['user'] == params['admin_user'] :
posts = Posts.query.all()
return render_template('dashboard.html',posts = posts)
#check if the admin is already logged in
if request.method=='POST':
username = request.form.get('uname')
userpass = request.form.get('pass')
if(username == params['admin_user'] and userpass == params['admin_password']):
#set the session variable
session['user'] = username
posts = Posts.query.all()
return render_template('dashboard.html',params = params ,posts= posts)
#REDIRECT TO ADMIN PANEL
else:
return render_template('login.html', params=params)
@app.route("/delete/<string:sno>" , methods = ['GET','POST'])
def delete(sno):
if 'user' in session and session['user'] == params['admin_user']:
post = Posts.query.filter_by(sno=sno).first()
db.session.delete(post)
db.session.commit()
return redirect('/dashboard')
@app.route("/uploader", methods=['GET', 'POST'])
def uploader():
if ("user" in session and session['user'] == params['admin_user']):
if(request.method == 'POST'):
f = request.files['file1']
f.save(os.path.join(app.config['UPLOAD_FOLDER'],secure_filename(f.filename)))
return "Uploaded successfully"
@app.route("/edit/<string:sno>", methods=['GET', 'POST'])
def edit(sno):
if ("user" in session and session['user'] == params['admin_user']):
if request.method == "POST":
box_title = request.form.get('title')
tline = request.form.get('tagline')
slug = request.form.get('slug')
content = request.form.get('content')
img_file = request.form.get('img_file')
date = datetime.now()
if sno == '0':
post = Posts(title=box_title, slug=slug, content=content, tagline=tline, img_file=img_file, date=date)
db.session.add(post)
db.session.commit()
else:
post=Posts.query.filter_by(sno=sno).first()
post.title = box_title
post.slug = slug
post.content = content
post.tagline = tline
post.img_file = img_file
post.date = date
db.session.commit()
return redirect('/edit/'+sno)
post = Posts.query.filter_by(sno=sno).first()
return render_template('edit.html', params = params,post = post,sno=sno )
app.run(debug=True)
构建日志
021-04-22T10:06:26.320935+00:00 app[web.1]: ModuleNotFoundError: No module named 'app'
2021-04-22T10:06:26.320999+00:00 app[web.1]: [2021-04-22 10:06:26 +0000] [8] [INFO] Worker exiting (pid: 8)
2021-04-22T10:06:26.344420+00:00 app[web.1]: Traceback (most recent call last):
2021-04-22T10:06:26.344423+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 202, in run
2021-04-22T10:06:26.344617+00:00 app[web.1]: self.manage_workers()
2021-04-22T10:06:26.344620+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 551, in manage_workers
2021-04-22T10:06:26.344765+00:00 app[web.1]: self.spawn_workers()
2021-04-22T10:06:26.344768+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 623, in spawn_workers
2021-04-22T10:06:26.344907+00:00 app[web.1]: time.sleep(0.1 * random.random())
2021-04-22T10:06:26.344910+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 242, in handle_chld
2021-04-22T10:06:26.344999+00:00 app[web.1]: self.reap_workers()
2021-04-22T10:06:26.344999+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 525, in reap_workers
2021-04-22T10:06:26.345124+00:00 app[web.1]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2021-04-22T10:06:26.345165+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2021-04-22T10:06:26.345173+00:00 app[web.1]:
2021-04-22T10:06:26.345173+00:00 app[web.1]: During handling of the above exception, another exception occurred:
2021-04-22T10:06:26.345173+00:00 app[web.1]:
2021-04-22T10:06:26.345176+00:00 app[web.1]: Traceback (most recent call last):
2021-04-22T10:06:26.345179+00:00 app[web.1]: File "/app/.heroku/python/bin/gunicorn", line 8, in <module>
2021-04-22T10:06:26.345221+00:00 app[web.1]: sys.exit(run())
2021-04-22T10:06:26.345228+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
2021-04-22T10:06:26.345283+00:00 app[web.1]: WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
2021-04-22T10:06:26.345285+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 231, in run
2021-04-22T10:06:26.345370+00:00 app[web.1]: super().run()
2021-04-22T10:06:26.345387+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 72, in run
2021-04-22T10:06:26.345437+00:00 app[web.1]: Arbiter(self).run()
2021-04-22T10:06:26.345449+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 229, in run
2021-04-22T10:06:26.345528+00:00 app[web.1]: self.halt(reason=inst.reason, exit_status=inst.exit_status)
2021-04-22T10:06:26.345530+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 342, in halt
2021-04-22T10:06:26.345635+00:00 app[web.1]: self.stop()
2021-04-22T10:06:26.345637+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 393, in stop
2021-04-22T10:06:26.345782+00:00 app[web.1]: time.sleep(0.1)
2021-04-22T10:06:26.345786+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 242, in handle_chld
2021-04-22T10:06:26.345855+00:00 app[web.1]: self.reap_workers()
2021-04-22T10:06:26.345858+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 525, in reap_workers
2021-04-22T10:06:26.345976+00:00 app[web.1]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2021-04-22T10:06:26.345992+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2021-04-22T10:06:26.401569+00:00 heroku[web.1]: Process exited with status 1
2021-04-22T10:06:26.494132+00:00 heroku[web.1]: State changed from starting to crashed
2021-04-22T10:52:27.200311+00:00 heroku[web.1]: State changed from crashed to starting
2021-04-22T10:52:32.303098+00:00 heroku[web.1]: Starting process with command `gunicorn app:main`
2021-04-22T10:52:35.765500+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [INFO] Starting gunicorn 20.1.0
2021-04-22T10:52:35.765624+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [INFO] Listening at: http://0.0.0.0:26129 (4)
2021-04-22T10:52:35.765700+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [INFO] Using worker: sync
2021-04-22T10:52:35.775598+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [7] [INFO] Booting worker with pid: 7
2021-04-22T10:52:35.775902+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [8] [INFO] Booting worker with pid: 8
2021-04-22T10:52:35.779140+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [7] [ERROR] Exception in worker process
2021-04-22T10:52:35.779141+00:00 app[web.1]: Traceback (most recent call last):
2021-04-22T10:52:35.779149+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
2021-04-22T10:52:35.779150+00:00 app[web.1]: worker.init_process()
2021-04-22T10:52:35.779150+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 134, in init_process
2021-04-22T10:52:35.779151+00:00 app[web.1]: self.load_wsgi()
2021-04-22T10:52:35.779151+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
2021-04-22T10:52:35.779151+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2021-04-22T10:52:35.779151+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 67, in wsgi
2021-04-22T10:52:35.779152+00:00 app[web.1]: self.callable = self.load()
2021-04-22T10:52:35.779152+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
2021-04-22T10:52:35.779152+00:00 app[web.1]: return self.load_wsgiapp()
2021-04-22T10:52:35.779153+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
2021-04-22T10:52:35.779153+00:00 app[web.1]: return util.import_app(self.app_uri)
2021-04-22T10:52:35.779153+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
2021-04-22T10:52:35.779154+00:00 app[web.1]: mod = importlib.import_module(module)
2021-04-22T10:52:35.779154+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/importlib/__init__.py", line 127, in import_module
2021-04-22T10:52:35.779154+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2021-04-22T10:52:35.779155+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
2021-04-22T10:52:35.779155+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
2021-04-22T10:52:35.779155+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
2021-04-22T10:52:35.779156+00:00 app[web.1]: ModuleNotFoundError: No module named 'app'
2021-04-22T10:52:35.779236+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [7] [INFO] Worker exiting (pid: 7)
2021-04-22T10:52:35.782185+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [8] [ERROR] Exception in worker process
2021-04-22T10:52:35.782186+00:00 app[web.1]: Traceback (most recent call last):
2021-04-22T10:52:35.782189+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
2021-04-22T10:52:35.782189+00:00 app[web.1]: worker.init_process()
2021-04-22T10:52:35.782189+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 134, in init_process
2021-04-22T10:52:35.782190+00:00 app[web.1]: self.load_wsgi()
2021-04-22T10:52:35.782190+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
2021-04-22T10:52:35.782190+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2021-04-22T10:52:35.782191+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 67, in wsgi
2021-04-22T10:52:35.782191+00:00 app[web.1]: self.callable = self.load()
2021-04-22T10:52:35.782192+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
2021-04-22T10:52:35.782192+00:00 app[web.1]: return self.load_wsgiapp()
2021-04-22T10:52:35.782192+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
2021-04-22T10:52:35.782193+00:00 app[web.1]: return util.import_app(self.app_uri)
2021-04-22T10:52:35.782193+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
2021-04-22T10:52:35.782194+00:00 app[web.1]: mod = importlib.import_module(module)
2021-04-22T10:52:35.782194+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/importlib/__init__.py", line 127, in import_module
2021-04-22T10:52:35.782194+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2021-04-22T10:52:35.782195+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
2021-04-22T10:52:35.782195+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
2021-04-22T10:52:35.782195+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
2021-04-22T10:52:35.782196+00:00 app[web.1]: ModuleNotFoundError: No module named 'app'
2021-04-22T10:52:35.786188+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [8] [INFO] Worker exiting (pid: 8)
2021-04-22T10:52:35.831703+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [WARNING] Worker with pid 8 was terminated due to signal 15
2021-04-22T10:52:35.927217+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [INFO] Shutting down: Master
2021-04-22T10:52:35.927266+00:00 app[web.1]: [2021-04-22 10:52:35 +0000] [4] [INFO] Reason: Worker failed to boot.
2021-04-22T10:52:36.443389+00:00 heroku[web.1]: Process exited with status 3
2021-04-22T10:52:36.637578+00:00 heroku[web.1]: State changed from starting to crashed
2021-04-22T10:55:27.910059+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=cs-sansar.herokuapp.com request_id=af486d95-d3bc-463a-8181-3c88c66df999 fwd="59.97.255.75" dyno= connect= service= status=503 bytes= protocol=https
2021-04-22T11:05:08.286594+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=cs-sansar.herokuapp.com request_id=051b33c9-4d95-4382-b49a-06b86b285692 fwd="59.97.255.75" dyno= connect= service= status=503 bytes= protocol=https
2021-04-22T11:11:29.478766+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=cs-sansar.herokuapp.com request_id=c6819801-a01f-4ad4-8650-f252e4898a3b fwd="59.97.255.75" dyno= connect= service= status=503 bytes= protocol=https
Config.json
{
"params":
{
"local_server": "True",
"local_uri": "mysql+mysqlconnector://root:@localhost/cs-sansar",
"prod_uri": "mysql+mysqlconnector://",
"blog_name": "cs-sansar",
"tag-line" : "Heaven for programmers",
"gmail-user": "abc16@gmail.com",
"gmail-password": "vxnv2",
"about_text": "CS-SANSAR or the computer science world is the absolute and right place for the geeks who want to learn trending technologies. We at CS-SANSAR provide you with efficient roadmaps to master any new tech.",
"about_dev_text": "Hi everyone ! This is Vinayak . I like to blog with a deep passion for learning and tutoring latest technology.",
"no_of_posts": 2,
"login_image": "login.jpg",
"admin_user" : "admin_user",
"admin_password": "admin@123",
"upload_location": "C:\\Users\\asus\\PycharmProjects\\Flask-blog\\static\\img"
}
}
还有如何在 config.json 中正确设置生产 URL?
答案 0 :(得分:0)
我认为您没有包含 Procfile 。 在终端写这个
pip install gunicorn
转到requirements.txt并添加gunicorn==(gunicorn版本)
然后在根文件夹中制作一个Procfile(P应该是大写)并添加这个
web: gunicorn main:app
推送到 heroku git