POST Methode wird von Flask ignoriert

Django, Flask, Bottle, WSGI, CGI…
Antworten
ahupfer
User
Beiträge: 23
Registriert: Mittwoch 15. August 2018, 07:24

Hallo Zusammen

Ich bin relativ neu in Python und gerade daran mich in Flask einzuarbeiten. Ich betreibe Python als
Hobby und zum Ausgleich, ich bin aber gelernter Informatiker mit über zehn Jahren Erfahrung.
Aktuell versuche ich ein Benutzerlogin und Registrierung zu implementieren, scheitere aber im
Moment an einem vermeintlich einfachen Formular! Aus irgend einem Grund scheint
Flask die POST Methode zu ignorieren und übermittelt und benutzt bei sämtlichen Requests
die GET Methode. Die ganze Authentifizierung habe ich über flask Blueprint implementiert.
Wenn ich das Formular abschicke wird folgendes log generiert:

Code: Alles auswählen

127.0.0.1 - - [15/Aug/2018 09:54:46] "GET /auth/register?username=Testname&email=test%40test.ch&password=test&confirm=test&submit=Login HTTP/1.1" 200 –
auch wenn ich dem Submit tag im html das Attribut method = POST mitgebe, wird dies von
flask ignoriert?!?

Da ich noch in meinem Lernprozess stecke, gehe ich von einem Überlegungsfehler aus und
hoffe ihr könnt mir auf die Sprünge helfen.
Hier der relevante Code:

app/__init__.py

Code: Alles auswählen

import os
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import config

bootstrap = Bootstrap()
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    db.init_app(app)
    migrate = Migrate(app, db)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix='/auth')
return app
app/auth/__init__.py

Code: Alles auswählen

from flask import Blueprint
auth = Blueprint('auth', __name__)
from . import views

app/auth/forms.py

Code: Alles auswählen

from wtforms import Form, BooleanField, StringField, PasswordField, SubmitField, validators

class RegistrationForm(Form):
    username = StringField('Usename', [validators.Length(min=4, max=25)])
    email = StringField('Email Address', [validators.Length(min=6, max=35)])
    password = PasswordField('New Password', [
        validators.DataRequired(),
        validators.EqualTo('confirm', message='Passwords must match')
    ])
    confirm = PasswordField('Repeat Password')
    accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])
    submit = SubmitField('Login')
app/auth/views.py

Code: Alles auswählen

from flask import render_template, session, redirect, url_for, current_app, request, flash
from ..models import User
from . import auth
from .forms import RegistrationForm

@auth.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm(request.form)
    if request.method == 'POST' and form.validate():
        user = User(username=form.username.data, email=form.email.data,
                    password_hash = form.password.data)
        db_session.add(user)
        flash('Thanks for registering')
        return redirect(url_for('/register'))
    #flash('something is wrong')
    return render_template('auth/register.html', form=form)
app/templates/auth/register.html

Code: Alles auswählen

{% extends "base.html" %}
{% block title %}Corp Management - Login{% endblock %}
{% block page_content %}

<div class="container">
    <div class="row">
        <form role="form">
            <div class="col-lg-6">
                <div class="well well-sm"><strong><span class="glyphicon glyphicon-asterisk"></span>Required Field</strong></div>
                <div class="form-group">
                    <label for="InputName" class="col-2 col-form-label">{{ form.username.label }}</label>
                    <div class="input-group">
                        {{ form.username(**{'class':'form-control', 'placeholder':'username'}) }}
                        <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
                    </div>
                </div>
                <div class="form-group">
                    <label for="InputEmail">{{ form.email.label }}</label>
                    <div class="input-group">
                        {{ form.email(**{'class':'form-control', 'placeholder':'eMail'}) }}
                        <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
                    </div>
                </div>
                <div class="form-group">
                    <label for="InputEmail">{{ form.password.label}}</label>
                    <div class="input-group">
                        {{ form.password(**{'class':'form-control'}) }}
                        <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
                    </div>
                </div>
                <div class="form-group">
                    <label for="InputEmail">{{ form.confirm.label}}</label>
                    <div class="input-group">
                        {{ form.confirm(**{'class':'form-control'}) }}
                        <span class="input-group-addon"><span class="glyphicon glyphicon-asterisk"></span></span>
                    </div>
                </div>
                  {{form.submit(**{'class':'btn btn-info pull-right'})}}
            </div>
        </form>
        <div class="col-lg-5 col-md-push-1">
            <div class="col-md-12">
              {% for field in form.errors %}
              {% for error in form.errors[field] %}
              <div class="alert alert-error">
                  <strong>Error!</strong> {{error}}
              </div>
              {% endfor %}
              {% endfor %}
            </div>
        </div>
    </div>
</div>
{% endblock %}
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ahupfer: Wenn Du ein GET im Log findest dann hat da nicht Flask etwas ignoriert, denn das entscheidet ja der Browser ob er nun GET oder POST macht. Und im gezeigten HTML steht nirgends welche HTTP-Methode der Browser verwenden soll, also macht der GET. Da fehlt beim <form> das das per POST übertragen werden soll.

Auf Flask Seite bei der Route gibst Du bei `method` nur an welche HTTP-Methoden diese Route bedient. Du sagst also Du kannst dort auch POST verarbeiten wenn es kommt, statt das eine Fehlermeldung wegen einer nicht unterstützten Methode von Flask an den Benutzer ausgeliefert wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Sowas wie:

Code: Alles auswählen

{% extends "base.html" %}
{% block title %}Corp Management - Login{% endblock %}
{% block page_content %}

<form method="POST">
	<div class="container">
    		<div class="row">
          	....
hattest du schon probiert?

edit: im div geht's nicht.
When we say computer, we mean the electronic computer.
ahupfer
User
Beiträge: 23
Registriert: Mittwoch 15. August 2018, 07:24

Ui ich bin auch zu blöd! Ein HTML Fehler!! Ich habe die Methode im Submit Tag angegeben also <Submit method="POST"> anstelle im form oder div tag. Das ganze hat mich jetzt sicher drei Stunden Zeit gekostet :shock: :lol:!
Na ja! Danke für die schnelle Antwort!
Grüsse
Andreas
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ahupfer: Im gezeigten Quelltext steht's ja gar nicht, auch nicht beim `submit`. Dort könnte es in HTML 5 auch stehen, dann heisst das Attribut aber `formmethod` statt nur `method` wie beim <form>.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ahupfer
User
Beiträge: 23
Registriert: Mittwoch 15. August 2018, 07:24

Ja Stimmt! Aber ich habes mit dem Attribut method="POST" im Submit Tag ausprobiert. Ich merke ich muss mich auch noch mit html5 auseinandersetzen, ich bin bei HTML4 stehen geblieben.
Antworten