Python 表单处理
表单是Web应用程序中用户交互的基础组件,它们允许用户向网站提交数据。在Python Web开发中,了解如何处理表单输入对于构建交互式网站至关重要。本文将介绍Python中表单处理的基本概念和实现方法。
什么是Web表单?
Web表单是HTML页面中的一个区域,包含各种输入元素如文本字段、复选框、单选按钮、下拉列表等,允许用户输入信息并提交给服务器。
基础HTML表单
在处理Python表单之前,我们需要先了解HTML表单的结构 :
<form action="/submit" method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username"><br />
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br />
<input type="submit" value="提交">
</form>
备注
action
属性指定表单提交的URL
method
属性指定提交方法,通常是GET或POST
Python 中的表单处理方法
在Python中,处理表单的方式取决于你使用的Web框架。下面我们将介绍三种主流框架中的表单处理方法。
1. Flask中的表单处理
Flask是一个轻量级的Python Web框架,它提供了简单的方式来处理表单数据。
基本表单处理
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def form():
return render_template('form.html')
@app.route('/submit', methods=['POST'])
def submit():
username = request.form.get('username')
password = request.form.get('password')
return f'用户名: {username}, 密码: {password}'
if __name__ == '__main__':
app.run(debug=True)
使用Flask-WTF扩展
Flask-WTF是Flask的一个扩展,提供了与WTForms库的集成,使表单处理更加简便:
from flask import Flask, render_template, redirect
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
class LoginForm(FlaskForm):
username = StringField('用户名', validators=[DataRequired(), Length(min=4, max=20)])
password = PasswordField('密码', validators=[DataRequired(), Length(min=8)])
submit = SubmitField('登录')
@app.route('/', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
return f'用户名: {form.username.data}, 密码: {form.password.data}'
return render_template('login.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
对应的HTML模板(login.html):
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录表单</h1>
<form method="POST">
{{ form.csrf_token }}
<div>
{{ form.username.label }}
{{ form.username }}
{% if form.username.errors %}
<span>{{ form.username.errors[0] }}</span>
{% endif %}
</div>
<div>
{{ form.password.label }}
{{ form.password }}
{% if form.password.errors %}
<span>{{ form.password.errors[0] }}</span>
{% endif %}
</div>
{{ form.submit }}
</form>
</body>
</html>
2. Django中的表单处理
Django是一个全功能的Python Web框架,它内置了强大的表单处理功能。
基本表单处理
# forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label='用户名', max_length=20)
password = forms.CharField(label='密码', widget=forms.PasswordInput)
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import LoginForm
def login_view(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
return HttpResponse(f'用户名: {username}, 密码: {password}')
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
对应的HTML模板(login.html):
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录表单</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="登录">
</form>
</body>
</html>
3. FastAPI中的表单处理
FastAPI是一个现代化、高性能的Web框架,它使用Pydantic进行数据验证。
from fastapi import FastAPI, Form, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def form(request: Request):
return templates.TemplateResponse("form.html", {"request": request})
@app.post("/submit")
async def submit(username: str = Form(...), password: str = Form(...)):
return {"username": username, "password": password}
对应的HTML模板(form.html):
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录表单</h1>
<form action="/submit" method="post">
<div>
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
</div>
<div>
<label for="password">密码:</label>
<input type="password" id="password" name="password">
</div>
<input type="submit" value="登录">
</form>
</body>
</html>