首页 > 解决方案 > 用烧瓶链接两个 html 页面

问题描述

我正在用烧瓶构建一个简单的订阅 webapp;我在 index.html 中有一个链接,用于使用查看功能的条款和条件页面url_for() ,如果我尝试直接访问该页面但由于以下错误而无法加载 miain 页面:

我尝试使用没有 url_for 的普通 a href 链接,但效果不佳:/

jinja2.exceptions.UndefinedError: 'terms' is undefined

Traceback (most recent call last)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Mahmoud\Desktop\subscribe form\app.py", line 45, in index
return render_template('index.html' )
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\templating.py", line 140, in render_template
ctx.app,
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\templating.py", line 120, in _render
rv = template.render(context)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\jinja2\asyncsupport.py", line 76, in render
return original_render(self, *args, **kwargs)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\jinja2\environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\jinja2\environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\jinja2\_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "C:\Users\Mahmoud\Desktop\subscribe form\templates\index.html", line 53, in top-level template code
<a href= {{url_for(terms)}} class="terms_link">شروط المسابقة</a> <br>
File "C:\Users\Mahmoud\.virtualenvs\subscribe_form-Eu2W50ez\lib\site-packages\flask\helpers.py", line 318, in url_for
if endpoint[:1] == ".":
jinja2.exceptions.UndefinedError: 'terms' is undefined 

我的脚本:

from flask import Flask, render_template, request, url_for 
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)

ENV = 'prod'

if ENV == 'dev':
  app.debug = True
  app.config['SQLALCHEMY_DATABASE_URI'] = ''
else: 
  app.debug = True
  app.config['SQLALCHEMY_DATABASE_URI'] = ''
app.config['SQLALCHEM_TRACK_MODIFICATIONS'] = False


db = SQLAlchemy(app)

class SeaSalt(db.Model):
  __tablename__ = 'seasalt'
  id = db.Column(db.Integer , primary_key = True)
  customer = db.Column(db.String(50))
  age = db.Column(db.Integer)
  birth_date = db.Column(db.Date)
  city = db.Column(db.String(50))
  mobile = db.Column(db.String(50), unique=True)
  email = db.Column(db.String(200), unique = True)
  job = db.Column(db.String(200))
  work_place = db.Column(db.String(200))

  def __init__(self, customer, age, birth_date, city, mobile, email, job, work_place):
      self.customer = customer
      self.age = age
      self.birth_date = birth_date
      self.city = city
      self.mobile = mobile
      self.email = email
      self.job = job
      self.work_place = work_place


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

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




@app.route('/submit', methods=['POST'])
def submit():
  if request.method == 'POST':
      customer = request.form['customer']
      age = request.form['age']
      birth_date = request.form['birth_date']
      city = request.form['city']
      mobile = request.form['mobile']
      email = request.form['email']
      job = request.form['job']
      work_place = request.form['work_place']

      if customer == '' or age == '' or mobile == '' or email =='':
          return render_template('index.html', message = 'من فضلك قم بادخال البيانات كاملة ') 
      if db.session.query(SeaSalt).filter(SeaSalt.email == email).count() == 0 or db.session.query(SeaSalt).filter(SeaSalt.mobile == mobile).count() ==0:

          data = SeaSalt(customer, age, birth_date, city, mobile, email, job, work_place)
          db.session.add(data)
          db.session.commit()
          registerd = data.id

          return render_template('success.html' , customer = customer , registerd = registerd)  #success.html
      return render_template('index.html', message = 'البريد الالكتروني/ رقم الهاتف مسجل من قبل ') 




if __name__ == "__main__":
  app.run()

索引.html


<!DOCTYPE html>
<html lang="ar" dir="rtl">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="../static/style.css">
    <title>Sea Salt Challange</title>
</head>

<body>
    <header>
             <p> #ثلجها_وسكراتش_بيثلجك   #سي_سولت_سكراتش   #تحدي_سكراتش </p> 
    </header>
    <div > 
        {% if message: %}
        <p class="message">{{ message }}</p>
        {% endif %} <br>
    </div>
    <div class="from-group" >

    <form action="/submit" method="POST" class="form-container" >
        <div>
            <input type="text" name="customer" placeholder="الأسم"> 
        </div>
        <div >

            <input type="text" name='age' placeholder="السن">
         </div>
        <div>


            <input placeholder="تاريخ الميلاد" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" name= 'birth_date'>

            <!-- <input type="date" name='birth_date' placeholder="تاريخ الميلاد"> -->
         </div>
        <div> 
            <input type="text" name="city" placeholder="المدينة"> 
        </div>
        <div> 
            <input type="text" name="mobile" placeholder="رقم الجوال"> 
        </div>
        <div>
            <input type="email" name="email" placeholder="البريد الالكتروني">
         </div>
        <div>
            <input type="text" name="job" placeholder="المهنة"> 
        </div>
        <div> 
            <input type="text" name="work_place" placeholder="محل العمل"> 
        </div>
        <a href= {{url_for(terms)}} class="terms_link">شروط المسابقة</a> <br>
        <input type="submit" value="اشترك في التحدي">

    </div>

    </form>
</body>

</html>

标签: pythonflask

解决方案


第一个参数url_for是端点的名称。因此,您需要先注册端点,

尝试,

# Controller
@app.route('/terms', endpoint='terms')
def terms(): 
    return render_template('/terms.html')



# In template use url_for like below
<a href= "{{url_for('terms')}}" class="terms_link">شروط المسابقة</a> 

推荐阅读