Форум сайта python.su
Всем привет. Недавно начал изучать Flask и вот решил сделать первый проект - страничку ресторана, с возможностью резервирования столика, подписки на рассылку и прочее.
Проблемы появилась когда делал функционал странички резервирования столика. После ввода всех данных, появляется ошибка - “TypeError: The view function for ‘booking’ did not return a valid response. The function either returned None or ended without a return statement.”
Как бы понятно что функция должна хоть что-то возвращать и в самой фунции я прописал return в случае GET запроса и тот который должен сделать редирект на главную страницу в случае удачного POST запроса.
Решил в функции booking перед return'ами поставить по print'у. Получается в консоли сначала появляется принт из exception и потом принт который после return render_template('booking.html')
Подскажите пожалуйста в чём может быть проблема и как её устранить.
Ниже привожу свой код:
Создаём таблицу:
from flask import Flask, request, redirect, render_template, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///restaurant_booking1.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Booking(db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(50), nullable=False) lastname = db.Column(db.String(50), nullable=False) email = db.Column(db.String(20), nullable=False) phone = db.Column(db.String(50), nullable=False) birthdate = db.Column(db.String(50), nullable=False) booking_date = db.Column(db.String(50), nullable=False) booking_time = db.Column(db.String(50), nullable=False) guests_nr = db.Column(db.String(5), nullable=False) notes = db.Column(db.Text(1000)) def __repr__(self): return '<Booking %r>' % self.id
@app.route('/booking', methods=['POST', 'GET']) def booking(): if request.method == 'POST': firstname = request.form['firstname'] lastname = request.form['lastname'] phone = request.form['phone'] email = request.form['email'] birthdate = request.form['birthdate'] booking_date = request.form['booking_date'] booking_time = request.form['booking_time'] guests_nr = request.form['guests_nr'] notes = request.form['notes'] reservation = Booking(firstname=firstname, lastname=lastname, email=email, phone=phone, birthdate=birthdate, booking_date=booking_date, booking_time=booking_time, guests_nr=guests_nr, notes=notes) try: db.session.add(reservation) db.session.commit() return redirect('/booking', code=303) except: return "An error has been occurred. Please, try again later" else: return render_template('booking.html')
{% block body %} <div class="booking-container"> <form method="post"> <input type="text" name="firstname" id="firstname" class="form-control" placeholder="First Name" required> <input type="text" name="lastname" id="lastname" class="form-control" placeholder="Last Name" required> <input type="text" name="email" id="email" class="form-control" placeholder="Email" required> <input type="text" name="phone" id="phone" class="form-control" placeholder="Phone Number" required> <input type="text" name="birthdate" id="birthdate" class="form-control" placeholder="Date of Birth" required> <input type="text" name="booking_date" id="booking_date" class="form-control" placeholder="Reservation Date" required> <input type="text" name="booking_time" id="booking_time" class="form-control" placeholder="Reservation Time" required> <input type="text" name="guests_nr" id="guests_nr" class="form-control" placeholder="Number of Guests" required> <textarea name="notes" id="notes" class="form-control" placeholder="Notes"></textarea> <input type="submit" class="btn-submit" value="Sent"> </form> </div> {% endblock %}
Отредактировано sepomd (Май 30, 2021 21:24:41)
Офлайн
ошибка оказалось очень простая
if request.method == 'POST':
@app.route('/admin_panel/admin_panel_bookings/') def admin_panel_bookings(): bookings = Booking.query.order_by(Booking.email).all() return render_template('admin_panel_bookings.html', bookings=bookings)
{% block body %} <div class="adm_bookings_container"> <h1>List of Bookings</h1> {{ subscribers[0].email }} </div> {% endblock %}
Отредактировано sepomd (Май 30, 2021 23:17:57)
Офлайн
sepomdНе, что-то не то ты нашёл, значит.
ошибка оказалось очень простая'POST' надо писать в квадратных скобкахif request.method == 'POST':
Отредактировано py.user.next (Май 31, 2021 01:24:15)
Офлайн
py.user.nextДа, вы были правы. Решил проверить если редирект работает правильно, указал другую страницу и после нажатия на кнопку сабмит, ничего не произошло. Просто исчезают данные введенные в формы и всё. Я так понимая срабатывает
else: return render_template('booking.html')
Офлайн
Решил сделать ещё одну функцию. Эта функция отвечает за подписку на всякие новости и пр.
def newsletter_signup():
if request.method == 'POST':
first_name = request.form['firstname']
last_name = request.form['lastname']
email = request.form['email']
newsletter = Newsletter(FirstName=first_name, LastName=last_name, Email=email)
db.session.add(newsletter)
db.session.commit()
return redirect(url_for('/'))
else:
return render_template('newsletter-signup.html')
if request.method == 'POST':
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: newsletter
from flask import Flask, request, redirect, render_template, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///restaurant_booking1.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Booking(db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(50), nullable=False) lastname = db.Column(db.String(50), nullable=False) email = db.Column(db.String(20), nullable=False) phone = db.Column(db.String(50), nullable=False) birthdate = db.Column(db.String(50), nullable=False) booking_date = db.Column(db.String(50), nullable=False) booking_time = db.Column(db.String(50), nullable=False) guests_nr = db.Column(db.String(5), nullable=False) notes = db.Column(db.Text, nullable=True) def __repr__(self): return '<Booking %r>' % self.id class Newsletter(db.Model): id = db.Column(db.Integer, primary_key=True) FirstName = db.Column(db.String(50), nullable=False) LastName = db.Column(db.String(50), nullable=False) Email = db.Column(db.String(20), nullable=False) def __repr__(self): return '<Newsletter %r>' % self.id
Офлайн
Ура товарищи!
На вторые сутки я всё-таки добился чтобы эта хрень заработала, правда пришлось кое-что переписать.
Теперь вопрос такой - кто знает хороший учебник/курс по Фласку/jinja?
код моего решения:
class Booking(db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(50)) lastname = db.Column(db.String(50)) email = db.Column(db.String(20)) phone = db.Column(db.String(50)) birthdate = db.Column(db.String(50)) booking_date = db.Column(db.String(50)) booking_time = db.Column(db.String(50)) guests_nr = db.Column(db.String(5)) notes = db.Column(db.Text) # def __repr__(self): # return '<Booking %r>' % self.id def __init__(self, firstname, lastname, email, phone, birthdate, booking_date, booking_time, guests_nr, notes): self.firstname = firstname self.lastname = lastname self.email = email self.phone = phone self.birthdate = birthdate self.booking_date = booking_date self.booking_time = booking_time self.guests_nr = guests_nr self.notes = notes class Newsletter(db.Model): id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String(50)) lastname = db.Column(db.String(50)) email = db.Column(db.String(20)) # def __repr__(self): # return '<Newsletter %r>' % self.id def __init__(self, firstname, lastname, email): self.firstname = firstname self.lastname = lastname self.email = email
@app.route('/booking/', methods=['GET', 'POST']) def booking(): if request.method == ['POST']: if not request.form['firstname'] or not request.form['lastname'] or not request.form['email'] or not \ request.form['phone'] or not request.form['birthdate'] or not request.form['booking_date'] or not request.form[ 'booking_time'] or not request.form['guests_nr'] or not request.form['notes']: else: bookings = Booking(request.form['firstname'], request.form['lastname'], request.form['email'], request.form['phone'], request.form['birthdate'], request.form['booking_date'], request.form['booking_time'], request.form['guests_nr'], request.form['notes']) db.session.add(bookings) db.session.commit() return redirect(url_for('index')) return render_template('booking.html')
@app.route('/newsletter-signup/', methods=['GET', 'POST']) def newsletter_signup(): if request.method == 'POST': if not request.form['firstname'] or not request.form['lastname'] or not request.form['email']: else: newsletters = Newsletter(request.form['firstname'], request.form['lastname'], request.form['email']) db.session.add(newsletters) db.session.commit() return redirect(url_for('index')) return render_template('newsletter-signup.html')
<table> <thead> <tr> <th>First Name</th> <th>Last Name</th> <th>Email</th> </tr> </thead> <tbody> {% for newsletters in Newsletter %} <tr> <td>{{ newsletters.firstname }}</td> <td>{{ newsletters.lastname }}</td> <td>{{ newsletters.email }}</td> </tr> {% endfor %} </tbody> </table>
Отредактировано sepomd (Май 31, 2021 23:48:47)
Офлайн