Python - formas frasco web

formulario web Python-matraz

1. Protección CSRF

request.form puede obtener los datos de los formularios presentados por la solicitud POST, y el proceso de expansión matraz de WTF puede manejar formularios web en una experiencia agradable.

Por defecto, el frasco-WTF proteger contra todas las formas CSRF (Cross-Site Request Falsificación, CSRF ) ataques. El sitio malicioso podría conducir a un ataque CSRF cuando la solicitud se envía a otro sitio por un atacante ha iniciado sesión.
Para lograr la protección CSRF, ajustes matraz de WTF requiere una clave. Matraz de WTF usando esta generación símbolo de clave de cifrado, a continuación, el token de solicitud de verificación de autenticidad formulario de datos. método de ajuste Key muestra en la figura.

app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'

app.config diccionario usado para almacenar el marco, y el propio programa extendieron las variables de configuración. Utilice la sintaxis diccionario estándar será capaz de añadir valor al objeto de configuración app.config. Este objeto también proporciona métodos, los valores de configuración se pueden importar de un archivo o el medio ambiente.

variables de configuración SECRET_KEY es una clave común, y se pueden utilizar en las extensiones múltiples de terceros frasco. Como su propio nombre, el nivel de cifrado en función del grado de confidencialidad del valor de la variable. Diferentes programas para utilizar diferentes claves **, sino también para asegurar que otras personas no saben la cadena que está utilizando.

Para mejorar la seguridad, la clave no debe ser escrito directamente en el código, y que desea guardar la variable de entorno

2. clase Form

Al utilizar matraz de WTF, cada formulario web está representada por una clase que hereda de la representación de formularios. Esta clase define un conjunto de campos de un formulario, cada campo representado por objetos. objeto de campo subsidiario puede ser uno o más función de validación. función Verificación se utiliza para los valores de entrada Validar presentados por el usuario para cumplir los requisitos.

clases de los formularios definidos:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class NameForm(Form):
	name = StringField('What is your name?',validators=[Requird()])
	submit = SubmitField('Submit')

Los campos del formulario se definen como una variable de clase, el valor de la variable es un tipo de campo de clase de objeto correspondiente. En este ejemplo, la forma NameForm tiene un campo de texto llamado nombre y presentar el nombre de un botón de envío. clase Stringfield representa el tipo de atributo = elemento de "texto". SubmitField clase representa el atributo type = "submit" elemento. El primer campo de parámetro constructor se utiliza cuando la forma de etiqueta se representa en HTML. Opcional parámetros validadores Stringfield constructor una lista especificada por la función de verificación de la composición, antes de aceptar los datos de verificación en los datos presentados por el usuario. función de validación Campo Obligatorio () garantizar la presentación no está vacía

WTForms apoyaron campos estándar HTML como se muestra en la tabla:

Tipo de campo explicación
Stringfield Los campos de texto
El campo de texto Área campos de texto multilínea
passwordField campo de texto Contraseña
Campo escondido campo de texto oculto
DateField Los campos de texto, el formato es datetime.date
DateTimeField Los campos de texto, el formato es datetime.datetime
IntegerField Los campos de texto, un valor entero
DecimalField Un campo de texto, el valor decimal.Decimal
FloatField Un campo de texto, como un flotador
BooleanField casilla de verificación, un valor de verdadero y falso
RadioField Un conjunto de botones de radio SelectField lista desplegable
SelectMultipleField En la lista desplegable, seleccione una pluralidad de valores
FileField campo de carga de archivos
SubmitField Formar botón de envío
Campo de formulario Como campos están incrustados en forma de otra forma
Lista de campo Campo de un tipo específico.

3. En vista de la forma de procesamiento de función

Ver índice de función () no sólo debe reproducir el formulario, sino también para recibir datos en un formulario

@app.route('/', methods=['GET', 'POST'])
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
    return render_template('index.html', form=form, name=name)

parámetros de métodos app.route decoradores dicen Frasco añadió en la asignación de URL a esta función de vista registrada como un controlador para peticiones GET y POST. Si no se especifica el parámetro métodos, es sólo la función de vista registrada como un controlador para peticiones GET.

POSTAL unió a la lista de los métodos es necesario porque se envía el formulario será tratada como una petición POST más conveniente. Los formularios también pueden ser presentadas como una petición GET, pero no hay petición GET cuerpo, los datos presentados en la forma de una cadena de consulta añade a la URL, se puede ver en la barra de direcciones del navegador. Basado en esto y una pluralidad de otras razones, la mayoría como un formulario de solicitud POST se presentó para su procesamiento.

A partir del nombre de la variable local utilizado para guardar el nombre introducido en el formulario, si no de entrada, es Ninguno. El código se muestra arriba, se utiliza para crear una vista NameForm instancia de clase que muestra una función de forma. Después de enviar el formulario, todos los datos se puede verificar si la función acepta, por lo validate_on_submit () devuelve un valor de true, de lo contrario False. El valor de retorno de esta función es la decisión de volver a reproducir el formulario o datos de envío de formularios procesados.

Los usuarios acceden al programa por primera vez, el servidor no recibirá un formulario de solicitud de datos GET, por lo validate_on_ submit () devolverá falso. El contenido se omite si declaración, haciendo que el solicitud de procesamiento plantilla, y pasa el objeto y la forma del nombre es Ninguno variable como un parámetro. Los usuarios verán un formulario que muestre su navegador.

Después de que el usuario envía el formulario, el servidor recibe una solicitud POST contiene datos. validate_on_submit () llamará en el nombre del campo subsidiaria requiere la función de validación (). Si el nombre no está vacía, se puede verificar, validate_on_ submit () devuelve verdadero. Ahora, el usuario introduce el nombre de las propiedades disponibles a través del campo de datos. En la sentencia if, el nombre asignado al nombre de variable local, a continuación, poner la propiedad de datos a una cadena vacía, de vaciar los campos de formulario. La última línea llama render_template () plantilla de función de representación, pero en esta ocasión el nombre del nombre del parámetro se introduce en el formulario, y por lo tanto un mensaje de bienvenida será visto por el usuario.

4. La sesión de usuario y redirección

Hay un problema de disponibilidad de la última versión de hello.py. Después de introducir el nombre de usuario que presente el formulario y, a continuación, haga clic en el botón de actualización del navegador, verá una advertencia inexplicable, pide una confirmación antes de enviar el formulario de nuevo. La razón por la que esto sucede es porque la última petición antes de volver a enviar el navegador cuando actualice la página ha sido expulsado. Si la solicitud es una solicitud POST que contiene los datos del formulario, actualizar la página para enviar el formulario de nuevo. En la mayoría de los casos, este no es el enfoque ideal.

Muchos usuarios no entienden los avisos enviados por el navegador. Por esta razón, lo mejor es dejar que el programa Web como una solicitud POST última solicitud enviada por el navegador.

La implementación de este requisito es que, como respuesta a la demanda de redirección de correos en lugar de la respuesta convencional. Redirección es una respuesta especial es una URL contenido de la respuesta, en lugar de una cadena que contiene el código HTML. Cuando el navegador recibe esta respuesta, se iniciará una solicitud GET a la URL redirigida, muestra el contenido de la página. Cargar esta página puede pasar unos microsegundos, porque primero tenemos una segunda petición al servidor. Además, los usuarios no notarán ninguna diferencia. Ahora, la última solicitud es una solicitud GET, el comando de actualización se puede utilizar de forma normal como se esperaba. Esta técnica se llama Mensaje / Redirigir / Obtener patrón.

Sin embargo, este método traerá otro problema. Cuando las asas Publicar demanda, utilizando form.name.data obtener el nombre introducido por el usuario, pero una vez que el final de la solicitud, se perderán los datos. Debido a que la solicitud POST usando el proceso de redirección, por lo que las necesidades del programa para guardar el nombre introducido, una solicitud de este tipo después de la redirección a obtener y utilizar el nombre con el fin de construir una respuesta real.

El programa se puede almacenar en la sesión de datos de usuario entre la solicitud de "recordar" los datos. La sesión de usuario es un almacenamiento privado, está presente en cada conexión con el cliente servidor. Hemos introducido una sesión de usuario en el capítulo 2, que es una variable denominada sesión de solicitud de contexto, como diccionarios de Python estándar como operaciones.

Por defecto, cookie de sesión del usuario almacenada en el cliente, utilice el conjunto SECRET_KEY criptográficamente firmado. Si alterar el contenido de la cookie, la firma no será válida, la sesión también se producirá un error.

from flask import Flask, render_template, session, redirect, url_for

@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        session['name'] = form.name.data
        return redirect(url_for('index'))
    return render_template('index.html', form=form, name=session.get('name'))

En la versión anterior del programa, el nombre de una variable local se utiliza para almacenar el nombre de usuario introducido en el formulario. Esta variable se almacena ahora en la sesión de usuario, es decir, la sesión [ 'nombre'], de manera que entre las peticiones pueden recordar los valores introducidos.

Ahora, la solicitud contiene datos de una forma válida finalmente llamará a la función de redirección (). redirect () es una función auxiliar utilizado para generar la respuesta de redirección HTTP. redirección de parámetros () es una URL de redireccionamiento, redireccionamiento de URL que se utiliza en el presente documento es la dirección raíz del programa, por lo tanto la respuesta de redireccionamiento podría escribir más simple, redirección de escritura ( '/'), sino que se utiliza para proporcionar Frasco la función de generación de URL url_for (). Recomendado url_for () genera una dirección URL, porque la asignación de usos de la función URL generado URL, URL y define a fin de garantizar ruta compatible, y el nombre de enrutamiento revisado todavía está disponible.

url_for () primero y sólo necesita especificar los parámetros de la función es el nombre de la variable, es decir, el nombre interno de la ruta. Por defecto, el punto final de enrutamiento es el nombre de una función de vista que se corresponde. En este ejemplo, la función de procesamiento es una vista de un índice de dirección de raíz (), y por lo tanto pasa la función url_for () es el índice de nombres.
Por último la función, un cambio se encuentra render_function (), un session.get ( 'nombre') lee directamente en el valor del parámetro de nombre de la sesión. Y el diccionario ordinaria, tal como se utiliza aquí get () Obtiene el diccionario correspondiente al valor de la clave para evitar anomalías clave no fue hallado, porque para una clave inexistente, get () devuelve el valor predeterminado Ninguno.

noticias 5.Flash

Después de la finalización de la solicitud, y, a veces es necesario dejar que el usuario sepa la situación ha cambiado. Aquí se puede utilizar el recordatorio mensaje de confirmación, aviso o error. Un ejemplo típico es un usuario envía un formulario de inicio de sesión que hay un error, el servidor devuelve una respuesta que volver a hacer el formulario de acceso, y muestra un mensaje en el formulario de arriba, que solicita al usuario un nombre de usuario o contraseña es incorrecta.

Esta función es una característica central de Matraz, función de flash () para lograr este efecto.

from flask import Flask, render_template, session, redirect, url_for, flash

@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        old_name = session.get('name')
        if old_name is not None and old_name != form.name.data:
            flash('Looks like you have changed your name!')
        session['name'] = form.name.data
        return redirect(url_for('index'))
    return render_template('index.html', form=form, name=session.get('name'))

En este ejemplo, el nombre de cada presentación será almacenada y se compara en un nombre de sesión de usuario, y el nombre se almacena en los datos de sesión a partir de una presentación anterior en esta forma. Si dos nombres no son los mismos, se llamará a las pantallas de las funciones del flash () un mensaje en una respuesta al cliente de.
Las llamadas sólo Flash, plantillas de los usos de programa () se visualiza la función no transforma el mensaje para hacer que estos mensajes. La mejor noticia en la prestación de plantilla basada en Flash, todas las páginas, ya que puede utilizar estos mensajes. Frasco los mensajes get_flashed_ () para abrir una plantilla, para obtener y procesar el mensaje

templates / base.html: Representación de noticias de Flash

{% block content %}
<div class="container">
    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        {{ message }}
    </div>
    {% endfor %}

    {% block page_content %}{% endblock %}
</div>
{% endblock %}

El uso de un bucle en la plantilla es porque antes de cada ciclo de demanda llamada flash () función genera un mensaje, se puede tener una pluralidad de mensajes de la pantalla en cola. get_flashed_messages () para obtener el mensaje no vuelve de nuevo en la siguiente llamada, por lo que el mensaje de Flash se muestra sólo una vez, y luego desapareció

Publicado 33 artículos originales · ganado elogios 1 · vistas 2291

Supongo que te gusta

Origin blog.csdn.net/qq_40805620/article/details/100919489
Recomendado
Clasificación