AssertionError:视图函数映射覆盖现有的端点函数:home - flask [英] AssertionError: View function mapping is overwriting an existing endpoint function: home - flask

查看:2054
本文介绍了AssertionError:视图函数映射覆盖现有的端点函数:home - flask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我试图通过 http://code.tutsplus.com/tutorials/an-introduction-to-pythons- flask-framework-net-28822

  C:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \python.exe C:/ ENVS / R2 /微型2 / intro_to_flask / __ init__.py 
C:\envs\virtalenvs\flask_mini\lib\site-packages\flask_sqlalchemy\__init __ PY。 :800:UserWarning:SQLALCHEMY_TRACK_MODIFICATIONS增加了大量开销,将来会被默认禁用。将其设置为True以禁止此警告。
warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS增加了大量开销,将来会被禁用,设置为True来取消这个警告')
Traceback(最近一次调用最后一次):
在< module>文件中的第13行的文件C:/ envs / r2 / mini2 / intro_to_flask / __ init__.py
from routes import mail
在< module>文件中,第9行的文件C:\\\\\\\\\\\\\\\\\\'
@ app.route('/')
文件C:\\\\\\\\\\\\\\\\\\\在装饰
self.add_url_rule(规则,端点,F **选项)
档C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\\ \\ app.py,第62行,在wrapper_func
返回f(self,* args,** kwargs)
文件C:\\\\\\\\\\\\\\\\ -packages \flask\app.py,第984行,在add_url_rule
'现有端点函数:%s'%端点)
AssertionError:视图函数映射覆盖现有的端点函数:

routes.py文件是:

<$ p从烧瓶中导入render_template,请求,闪存,会话url_for,从形式重定向
$ p> 从intro_to_flask进口应用
导入的ContactForm,SignupForm,从烧瓶SigninForm
。 ext.mail导入消息,邮件
从模型导入数据库,用户

邮件=邮件()


@ app.route('/')
def home():
return render_template('home.html')


@ app.route('/ about')
def about():
return render_template(' ')


@ 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 =
发件人:%s<%s>
%s
%(form.name.data,form.email.data,form.message.data)
mail.send(msg)

返回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 )

如果session中有'email':
返回重定向(url_for('profile'))

如果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 redire ct(url_for('profile'))

elif request.method =='GET':
return render_template('signup.html',form = form)


@ app.route('/ profile')
def profile():
如果'email'不在会话中:
返回重定向(url_for('signin') )

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

如果用户是None:
return redirect( url_for('signin'))
else:
return render_template('profile.html')


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

如果会话中有'email':
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
返回重定向(url_for('profile'))

elif request.method =='GET':
return render_template('signin.html',form = form)


@ app.route('/ signout')
def signout():
如果'email'不在会话中:
返回重定向(url_for('signin' ))

session.pop('email',None)
return redirect(url_for('home'))
b
$ b $ 可能是什么原因造成这种情况?

编辑:

当我把关于函数首先得到︰

  AssertionError:视图函数映射覆盖现有的端点函数:大约

所以我认为这个问题可能在导入语句中,或者至少在第一个路由之前:

  from intro_to_flask导入应用程序$ b $ from flask导入render_template,request,flash,session,url_for,重定向
从窗体import ContactForm ,SignupForm,SigninForm
from flask.ext.mail import Mail,Message
from models import db,User
$ b $ mail = Mail()

编辑2:

  from flask import Flask 

app = Flask(__ name__)

app.secret_key ='development key'
$ b 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] = '您的密码'
$ b $从路线导入邮件
mail.init_app(APP)

的app.config [ 'SQLALCHEMY_DATABASE_URI' b ] ='mysql:// your-username:your-password @ localhost / development'
$ b $ from models import db
db.init_app(app)

import intro_to_flask.routes


解决方案

此错误是因为您是循环导入应用程序(你在routes.py中导入的应用程序,并在应用程序中导入routes.py)
这种模式doesn'工作,是不正确的。
在烧瓶中,您可以将整个应用程序写入单个文件中,也可以使用烧瓶蓝图以模块形式进行
http://flask.pocoo.org/docs/0.10/blueprints/

你的应用程序可以在单个文件:

  from flask导入render_template,request,flash,session,url_for,redirect 
从窗体导入ContactForm,SignupForm, signinForm
from flask.ext.mail import消息,邮件
从模型导入数据库,用户
$ b $从烧瓶导入Flask

app = Flask(__ name__ )

app.secret_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)
$ b app.config ['SQLALCHEMY_D ATABASE_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()
$ b如果request.method == 'POST':
if form.validate()== False:
flash('All fields are required。')
return render_template('contact.html',form = form)
else:
msg =留言(form.subject.data,sender='contact@example.com',recipients = ['your_email@example.com'])
msg.body =
来自:%s<%s>
%s
%(form.name.data,form.email.data,form.message.data)
mail.send(msg)

返回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 )

如果session中有'email':
返回重定向(url_for('profile'))

如果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 redire ct(url_for('profile'))

elif request.method =='GET':
return render_template('signup.html',form = form)


@ app.route('/ profile')
def profile():
如果'email'不在会话中:
返回重定向(url_for('signin') )

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

如果用户是None:
return redirect( url_for('signin'))
else:
return render_template('profile.html')


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

如果会话中有'email':
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
返回重定向(url_for('profile'))

elif request.method =='GET':
return render_template('signin.html',form = form)


@ app.route('/ signout')
def signout():
如果'email'不在会话中:
返回重定向(url_for('signin' ))

session.pop('email',None)
return redirect(url_for('home'))

app.run()


I'm trying to work my way through 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 <module>
    from routes import mail
  File "C:\envs\r2\mini2\intro_to_flask\routes.py", line 9, in <module>
    @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

the routes.py file is:

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>
            %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'))

What could be causing this?

Edit:

When I put the about function first I get:

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

So I think the problem may be in the import statements or at least before the first route:

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()

edit 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

解决方案

This error is because you are cyclic import app (you imported app in routes.py and imported routes.py in app) This pattern doesn't work and is not correct. In flask you can write the whole application in single file or you can use flask blueprints to make in modular http://flask.pocoo.org/docs/0.10/blueprints/

You application can work in a single file:

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>
            %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()

这篇关于AssertionError:视图函数映射覆盖现有的端点函数:home - flask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆