Python网络编程:Web框架基础(Flask/Django)

简介: Python作为一种功能强大且易于使用的编程语言,广泛应用于Web开发领域。Python的丰富生态系统中,有两个非常流行的Web框架:Flask和Django。本博文将详细介绍这两个框架的基础知识,并通过综合示例展示如何使用它们构建Web应用。

Python作为一种功能强大且易于使用的编程语言,广泛应用于Web开发领域。Python的丰富生态系统中,有两个非常流行的Web框架:Flask和Django。本博文将详细介绍这两个框架的基础知识,并通过综合示例展示如何使用它们构建Web应用。

一、Flask基础

1.1 Flask简介

Flask是一个轻量级的Web框架,设计简单且易于扩展。Flask遵循WSGI标准,采用模块化设计,允许开发者根据需要选择和配置组件。

1.2 安装Flask

在安装Flask之前,确保你已经安装了Python。你可以使用以下命令来安装Flask:

pip install Flask

1.3 第一个Flask应用

创建一个名为app.py的文件,并添加以下代码:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
    return "Hello, Flask!"
if __name__ == '__main__':
    app.run(debug=True)

运行应用:

python app.py

在浏览器中访问http://127.0.0.1:5000/,你会看到“Hello, Flask!”的输出。

1.4 路由和视图函数

Flask通过路由将URL映射到视图函数。视图函数处理请求并返回响应。

@app.route('/hello')
def hello():
    return "Hello, World!"

你还可以使用URL变量:

@app.route('/user/<name>')
def user(name):
    return f"Hello, {name}!"

1.5 模板渲染

Flask使用Jinja2作为模板引擎。创建一个templates目录,并在其中创建一个名为index.html的文件:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>

修改视图函数以渲染模板:

from flask import render_template
@app.route('/')
def home():
    return render_template('index.html', message="Hello, Flask!")

1.6 表单处理

Flask-WTF扩展提供了对表单处理的支持。首先安装Flask-WTF:

pip install Flask-WTF

创建一个表单类:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    submit = SubmitField('Submit')

在视图函数中处理表单:

from flask import Flask, render_template, flash, redirect, url_for
from forms import NameForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
@app.route('/', methods=['GET', 'POST'])
def home():
    form = NameForm()
    if form.validate_on_submit():
        flash(f'Hello, {form.name.data}!')
        return redirect(url_for('home'))
    return render_template('index.html', form=form)

在模板中渲染表单:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.name.label }} {{ form.name() }}
        {{ form.submit() }}
    </form>
    {% with messages = get_flashed_messages() %}
    {% if messages %}
    <ul>
        {% for message in messages %}
        <li>{{ message }}</li>
        {% endfor %}
    </ul>
    {% endif %}
    {% endwith %}
</body>
</html>

1.7 数据库集成

Flask-SQLAlchemy扩展提供了对数据库的支持。首先安装Flask-SQLAlchemy:

pip install Flask-SQLAlchemy

配置数据库:

from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)

定义模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    def __repr__(self):
        return f'<User {self.username}>'

创建数据库:

python
>>> from app import db
>>> db.create_all()

1.8 用户认证

Flask-Login扩展提供了对用户认证的支持。首先安装Flask-Login:

pip install Flask-Login

配置Flask-Login:

from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
class User(UserMixin, db.Model):
    # ...
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

定义登录视图:

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user and user.check_password(form.password.data):
            login_user(user)
            return redirect(url_for('dashboard'))
    return render_template('login.html', form=form)

定义登出视图:

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('home'))

二、Django基础

2.1 Django简介

Django是一个功能全面的Web框架,提供了内置的ORM、表单处理、用户认证、管理后台等功能,适合开发大型复杂的Web应用。

2.2 安装Django

你可以使用以下命令来安装Django:

pip install Django

2.3 创建Django项目

使用以下命令创建一个新的Django项目:

django-admin startproject myproject

进入项目目录:

cd myproject

2.4 应用与路由

在Django中,项目由多个应用组成。使用以下命令创建一个新的应用:

python manage.py startapp myapp

在settings.py中添加应用:

INSTALLED_APPS = [
    # ...
    'myapp',
]

配置路由:

from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
]

定义视图:

from django.shortcuts import render
def home(request):
    return render(request, 'home.html')

2.5 模板渲染

Django使用Django模板引擎。创建一个templates目录,并在其中创建一个名为home.html的文件:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>Welcome to Django</h1>
</body>
</html>

2.6 表单处理

Django提供了强大的表单处理功能。创建一个表单类:

from django import forms
class NameForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)

在视图中处理表单:

from django.shortcuts import render, redirect
from .forms import NameForm
def home(request):
    if request.method == 'POST':
        form = NameForm(request.POST)
        if form.is_valid():
            # 处理数据
            return redirect('success')
    else:
        form = NameForm()
    return render(request, 'home.html', {'form': form})

在模板中渲染表单:

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
</body>
</html>

2.7 数据库操作

Django内置了ORM,可以轻松地进行数据库操作。定义模型:

from django.db import models
class User(models.Model):
    username = models.CharField(max_length=80, unique=True)
    email = models.EmailField(unique=True)
    def __str__(self):
        return self.username

在admin.py中注册模型:

from django.contrib import admin
from .models import User
admin.site.register(User)

创建数据库表:

python manage.py makemigrations
python manage.py migrate

2.8 用户认证

Django提供了内置的用户认证系统。在settings.py中配置登录URL:

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

创建登录视图:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginForm
def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

创建登出视图:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginForm
def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

三、Flask与Django的比较

3.1 灵活性与功能

Flask是一个微框架,灵活性高,适用于中小型项目。它提供了基本的Web开发功能,开发者可以根据需求选择合适的扩展库。


Django是一个功能全面的框架,适用于大型项目。它内置了ORM、表单处理、身份验证、管理后台等功能,减少了开发者的工作量。

3.2 学习曲线

Flask的学习曲线较为平缓,适合初学者快速上手。其简单易懂的设计理念使得开发者能够快速构建Web应用。


Django的学习曲线相对陡峭,但其强大的功能和一致的设计使得开发大型项目变得更加高效。一旦掌握了Django,开发者能够在短时间内构建功能丰富的Web应用。

3.3 社区与文档

Flask和Django都有活跃的社区和丰富的文档。Flask的文档简洁明了,Django的文档详尽全面,开发者可以根据需求选择合适的框架。

四、综合示例

4.1 Flask综合示例

创建一个名为flask_app的目录,并在其中创建以下文件:

4.1.1 app.py

from flask import Flask, render_template, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    def __repr__(self):
        return f'<User {self.username}>'
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))
class RegisterForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Register')
class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')
@app.route('/')
def home():
    return render_template('home.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        flash('You have been registered!', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user and user.password == form.password.data:
            login_user(user)
            flash('Login successful!', 'success')
            return redirect(url_for('home'))
    return render_template('login.html', form=form)
@app.route('/logout')
@login_required
def logout():
    logout_user()
    flash('You have been logged out.', 'info')
    return redirect(url_for('home'))
if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

4.1.2 templates/home.html

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>Welcome to Flask</h1>
    {% if current_user.is_authenticated %}
        <p>Hello, {{ current_user.username }}!</p>
        <a href="{{ url_for('logout') }}">Logout</a>
    {% else %}
        <a href="{{ url_for('login') }}">Login</a>
        <a href="{{ url_for('register') }}">Register</a>
    {% endif %}
</body>
</html>

4.1.3 templates/register.html

<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.username.label }} {{ form.username() }}
        {{ form.password.label }} {{ form.password() }}
        {{ form.submit() }}
    </form>
</body>
</html>

4.1.4 templates/login.html

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.username.label }} {{ form.username() }}
        {{ form.password.label }} {{ form.password() }}
        {{ form.submit() }}
    </form>
</body>
</html>

4.2 Django综合示例

创建一个名为django_app的目录,并在其中创建以下文件:

4.2.1 创建Django项目

django-admin startproject django_app
cd django_app
python manage.py startapp main

4.2.2 配置settings.py

在settings.py中添加应用:

INSTALLED_APPS = [
    # ...
    'main',
    'django.contrib.sites',
    'django.contrib.messages',
]
MIDDLEWARE = [
    # ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ...
                'django.template.context_processors.request',
            ],
        },
    },
]
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

4.2.3 创建模型

在main/models.py中定义模型:

from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
    pass

在main/admin.py中注册模型:

from django.contrib import admin
from .models import CustomUser
admin.site.register(CustomUser)

4.2.4 创建表单

在main/forms.py中定义表单:

from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('email',)
class CustomAuthenticationForm(AuthenticationForm):
    class Meta:
        model
 = CustomUser
        fields = ('username', 'password')

4.2.5 配置URL和视图

在main/views.py中定义视图:

from django.shortcuts import render, redirect
from django.contrib.auth import login, logout
from .forms import CustomUserCreationForm, CustomAuthenticationForm
def home(request):
    return render(request, 'home.html')
def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = CustomUserCreationForm()
    return render(request, 'register.html', {'form': form})
def login_view(request):
    if request.method == 'POST':
        form = CustomAuthenticationForm(request, data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')
    else:
        form = CustomAuthenticationForm()
    return render(request, 'login.html', {'form': form})
def logout_view(request):
    logout(request)
    return redirect('home')

在django_app/urls.py中配置URL:

from django.contrib import admin
from django.urls import path
from main import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('register/', views.register, name='register'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
]

4.2.6 创建模板

在项目根目录下创建一个templates目录,并在其中创建以下文件:

home.html

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>Welcome to Django</h1>
    {% if user.is_authenticated %}
        <p>Hello, {{ user.username }}!</p>
        <a href="{% url 'logout' %}">Logout</a>
    {% else %}
        <a href="{% url 'login' %}">Login</a>
        <a href="{% url 'register' %}">Register</a>
    {% endif %}
</body>
</html>

register.html

<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Register</button>
    </form>
</body>
</html>

login.html

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Login</button>
    </form>
</body>
</html>

4.2.7 运行项目

运行项目:

python manage.py runserver

在浏览器中访问http://127.0.0.1:8000/,你会看到Django应用的首页。

五、总结

通过本文的介绍,我们了解了Flask和Django两个流行的Python Web框架的基础知识。Flask作为一个轻量级框架,适合中小型项目,具有较高的灵活性。Django作为一个功能全面的框架,适合大型复杂项目,内置了丰富的功能。通过综合示例,我们展示了如何使用这两个框架构建Web应用,希望读者能够根据自己的需求选择合适的框架,并在实际项目中加以应用。


作者:Rjdeng

链接:https://juejin.cn/post/7398747326070865929

相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
142 55
|
21天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
110 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
15天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
39 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
9天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
33 7
|
7天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
33 2
|
21天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
52 3
|
22天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
26天前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
40 6
|
29天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
52 8
|
28天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。