Flask/Grinberg/03 - Formuláře

Z Wikiverzity
Jak používat klasifikační nálepkuTato stránka je součástí projektu:
Příslušnost: všeobecná


03 - Formuláře[editovat]

Chapter 3: Web Forms

Introduction to Flask-WTF[editovat]

Configuration[editovat]

User Login Form[editovat]

Form Templates[editovat]

Naučíme se vyplňovat formuláře metodou POST v souboru login.html:

{% extends "base.html" %}

{% block content %}
    <h1>Sign In</h1>
    <form method="post" novalidate>  <!-- validation will be done on the server side -->
        {{ form.hidden_tag() }}	<!-- protect the form against CSRF attacks, see SECRET_KEY -->
        <p>
            {{ form.username.label }}<br>
            {{ form.username(size=32) }}
        </p>
        <p>
            {{ form.password.label }}<br>
            {{ form.password(size=32) }}
        </p>
        <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
        <p>{{ form.submit() }}</p>
    </form>
{% endblock %}

Přitom dostávám chybu Method Not Allowed – The method is not allowed for the requested URL (chyba 405).

Co je to za chybu a jak jí čelit? Viz:

Rovněž dle w:Stavové kódy HTTP Pochopíme, že chyby se dělí m.j. na:

  • 5xx – server error responses – například známá 500 Internal server error
  • 4xx – client error responses – například 404 Page Not Found (je to chyba klienta, že chce něco, co není!)

O.K., dočetli jsme se, že odhalit chybu 405 je často dost obtížné – neodhalil jsem.

Někde na nějakém videu jsem si všiml, že v souboru routes.py při definici webové stránky, která používá jinou metodu, než POST, to musí být explicitně uvedeno. Tedy:

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

A vida! To je to, co nakonec pomohlo. Divím se, že Grinberg to tam neměl uvedeno. AHA! Má to tam uvedeno. Jenže kousek dále, než jsem dočetl. Dokonce i s tou chybou, která tak vznikne. Byl jsem zkrátka rychlejší...

Nicméně jsem přitom také odkoukal, že ten chlapík ten problém řeší v jakémsi prostředí:

Zajímavé věci...

Form Views[editovat]

Receiving Form Data[editovat]

Vybrání dat z formuláře je jednoduché – vrací je metoda:

form.jméno_pole.data
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():                                       # receives the form by POST                                                                                      
        flash('Login requested for user {}, remember_me={}'.format(
            form.username.data, form.remember_me.data))
        return redirect('/index')
    return render_template('login.html', title='Sign In', form=form)   # sends the form to the client – GET

V tomto oddílu se také naučíme používat funkci flash, která kumuluje různé hlášky do svého seznamu, ke kterému je pak možno přistoupit (a zároveň jej vyprázdnit) funkcí

get_flashed_messages()

Zprávy si pak můžeme zobrazit např. HTML kódem:

        {% with messages = get_flashed_messages() %}
        {% if messages %}
        <hr> 
        <i>Hlášky:</i>
        <ul>
            {% for message in messages %}
            <li>{{ message }}</li>
            {% endfor %}
        </ul>
        <hr>
        {% endif %}
        {% endwith %}