pythonassertionerror_关于python:AssertionError:View函数映射正在覆盖现有的端点函数:home – flask...

我正在努力学习http://code.tutsplus.com/tutorials/an-introduction-to-pythons-flask-framework--net-28822

C:\envs\virtalenvs\flask_mini\Scripts\python.exe C:/envs/r2/mini2/intro_to_flask/__init__.py

C:\envs\virtalenvs\flask_mini\lib\site-packages\flask_sqlalchemy\__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.

warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')

Traceback (most recent call last):

File"C:/envs/r2/mini2/intro_to_flask/__init__.py", line 13, in

from routes import mail

File"C:\envs

2\mini2\intro_to_flask

outes.py", line 9, in

@app.route('/')

File"C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1013, in decorator

self.add_url_rule(rule, endpoint, f, **options)

File"C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 62, in wrapper_func

return f(self, *args, **kwargs)

File"C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 984, in add_url_rule

'existing endpoint function: %s' % endpoint)

AssertionError: View function mapping is overwriting an existing endpoint function: home

routes.py文件是:

from intro_to_flask import app

from flask import render_template, request, flash, session, url_for, redirect

from forms import ContactForm, SignupForm, SigninForm

from flask.ext.mail import Message, Mail

from models import db, User

mail = Mail()

@app.route('/')

def home():

return render_template('home.html')

@app.route('/about')

def about():

return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])

def contact():

form = ContactForm()

if request.method == 'POST':

if form.validate() == False:

flash('All fields are required.')

return render_template('contact.html', form=form)

else:

msg = Message(form.subject.data, sender='contact@example.com', recipients=['your_email@example.com'])

msg.body ="""

From: %s

%s

""" % (form.name.data, form.email.data, form.message.data)

mail.send(msg)

return render_template('contact.html', success=True)

elif request.method == 'GET':

return render_template('contact.html', form=form)

@app.route('/signup', methods=['GET', 'POST'])

def signup():

form = SignupForm()

if 'email' in session:

return redirect(url_for('profile'))

if request.method == 'POST':

if form.validate() == False:

return render_template('signup.html', form=form)

else:

newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)

db.session.add(newuser)

db.session.commit()

session['email'] = newuser.email

return redirect(url_for('profile'))

elif request.method == 'GET':

return render_template('signup.html', form=form)

@app.route('/profile')

def profile():

if 'email' not in session:

return redirect(url_for('signin'))

user = User.query.filter_by(email=session['email']).first()

if user is None:

return redirect(url_for('signin'))

else:

return render_template('profile.html')

@app.route('/signin', methods=['GET', 'POST'])

def signin():

form = SigninForm()

if 'email' in session:

return redirect(url_for('profile'))

if request.method == 'POST':

if form.validate() == False:

return render_template('signin.html', form=form)

else:

session['email'] = form.email.data

return redirect(url_for('profile'))

elif request.method == 'GET':

return render_template('signin.html', form=form)

@app.route('/signout')

def signout():

if 'email' not in session:

return redirect(url_for('signin'))

session.pop('email', None)

return redirect(url_for('home'))

这可能是什么原因造成的?

编辑:

当我把about函数放在第一位时,我得到:

AssertionError: View function mapping is overwriting an existing endpoint function: about

因此,我认为问题可能出在import语句中,或者至少在第一个路由之前:

from intro_to_flask import app

from flask import render_template, request, flash, session, url_for, redirect

from forms import ContactForm, SignupForm, SigninForm

from flask.ext.mail import Mail, Message

from models import db, User

mail = Mail()

编辑2:

from flask import Flask

app = Flask(__name__)

app.secret_key = 'development key'

app.config["MAIL_SERVER"] ="smtp.gmail.com"

app.config["MAIL_PORT"] = 465

app.config["MAIL_USE_SSL"] = True

app.config["MAIL_USERNAME"] = 'contact@example.com'

app.config["MAIL_PASSWORD"] = 'your-password'

from routes import mail

mail.init_app(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://your-username:your-password@localhost/development'

from models import db

db.init_app(app)

import intro_to_flask.routes

我不知道这是否相关,但是你的home()函数中显然有一个缩进问题。

@尼古拉斯,我们通常建议使用4个空格,对吗?他把2和4个空格混在一起。

感谢您指出这一点,我已经将格式改为4个空格(见上文),但错误没有改变。

你的__init__.py文件里有什么?

请参见编辑2

此错误是因为您是循环导入应用程序(在routes.py中导入应用程序,在app中导入routes.py)这种模式不起作用,也不正确。在flask中,您可以将整个应用程序编写成单个文件,也可以使用flask蓝图以模块化方式制作。http://flask.pocoo.org/docs/0.10/蓝图/

应用程序可以在单个文件中工作:

from flask import render_template, request, flash, session, url_for, redirect

from forms import ContactForm, SignupForm, SigninForm

from flask.ext.mail import Message, Mail

from models import db, User

from flask import Flask

app = Flask(__name__)

app.secret_key = 'development key'

app.config["MAIL_SERVER"] ="smtp.gmail.com"

app.config["MAIL_PORT"] = 465

app.config["MAIL_USE_SSL"] = True

app.config["MAIL_USERNAME"] = 'contact@example.com'

app.config["MAIL_PASSWORD"] = 'your-password'

mail = Mail()

mail.init_app(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://your-username:your-password@localhost/development'

from models import db

db.init_app(app)

@app.route('/')

def home():

return render_template('home.html')

@app.route('/about')

def about():

return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])

def contact():

form = ContactForm()

if request.method == 'POST':

if form.validate() == False:

flash('All fields are required.')

return render_template('contact.html', form=form)

else:

msg = Message(form.subject.data, sender='contact@example.com', recipients=['your_email@example.com'])

msg.body ="""

From: %s

%s

""" % (form.name.data, form.email.data, form.message.data)

mail.send(msg)

return render_template('contact.html', success=True)

elif request.method == 'GET':

return render_template('contact.html', form=form)

@app.route('/signup', methods=['GET', 'POST'])

def signup():

form = SignupForm()

if 'email' in session:

return redirect(url_for('profile'))

if request.method == 'POST':

if form.validate() == False:

return render_template('signup.html', form=form)

else:

newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)

db.session.add(newuser)

db.session.commit()

session['email'] = newuser.email

return redirect(url_for('profile'))

elif request.method == 'GET':

return render_template('signup.html', form=form)

@app.route('/profile')

def profile():

if 'email' not in session:

return redirect(url_for('signin'))

user = User.query.filter_by(email=session['email']).first()

if user is None:

return redirect(url_for('signin'))

else:

return render_template('profile.html')

@app.route('/signin', methods=['GET', 'POST'])

def signin():

form = SigninForm()

if 'email' in session:

return redirect(url_for('profile'))

if request.method == 'POST':

if form.validate() == False:

return render_template('signin.html', form=form)

else:

session['email'] = form.email.data

return redirect(url_for('profile'))

elif request.method == 'GET':

return render_template('signin.html', form=form)

@app.route('/signout')

def signout():

if 'email' not in session:

return redirect(url_for('signin'))

session.pop('email', None)

return redirect(url_for('home'))

app.run()

嗨,伊特玛德,谢谢你看。我要运行什么文件?我要删除init.py文件吗?

创建一个包含所有代码的文件,然后您可以运行它。

谢谢你,我在in it.py和run routes.py中对所有内容都进行了评论,结果成功了!

伊特玛德,你对部署到Heroku有什么建议吗?我遇到问题stackoverflow.com/questions/34966616/…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值