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

embedded/2024/10/16 2:27:38/

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

一、Flask基础

1.1 Flask简介

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

1.2 安装Flask

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

python">pip install Flask
1.3 第一个Flask应用

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

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

运行应用:

python">python app.py

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

1.4 路由和视图函数

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

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

你还可以使用URL变量:

python">@app.route('/user/<name>')
def user(name):return f"Hello, {name}!"
1.5 模板渲染

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

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

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

python">from flask import render_template@app.route('/')
def home():return render_template('index.html', message="Hello, Flask!")
1.6 表单处理

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

python">pip install Flask-WTF

创建一个表单类:

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

在视图函数中处理表单:

python">from flask import Flask, render_template, flash, redirect, url_for
from forms import NameFormapp = 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

在模板中渲染表单:

python"><!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:

python">pip install Flask-SQLAlchemy

配置数据库:

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

定义模型:

python">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">python
>>> from app import db
>>> db.create_all()
1.8 用户认证

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

python">pip install Flask-Login

配置Flask-Login:

python">from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_userlogin_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))

定义登录视图:

python">@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)

定义登出视图:

python">@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:

python">pip install Django
2.3 创建Django项目

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

python">django-admin startproject myproject

进入项目目录:

python">cd myproject
2.4 应用与路由

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

python">python manage.py startapp myapp

在settings.py中添加应用:

python">INSTALLED_APPS = [# ...'myapp',
]

配置路由:

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

定义视图:

python">from django.shortcuts import renderdef home(request):return render(request, 'home.html')
2.5 模板渲染

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

python"><!DOCTYPE html>
<html>
<head><title>Home</title>
</head>
<body><h1>Welcome to Django</h1>
</body>
</html>
2.6 表单处理

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

python">from django import formsclass NameForm(forms.Form):name = forms.CharField(label='Your name', max_length=100)

在视图中处理表单:

python">from django.shortcuts import render, redirect
from .forms import NameFormdef 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})

在模板中渲染表单:

python"><!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,可以轻松地进行数据库操作。定义模型:

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

在admin.py中注册模型:

python">from django.contrib import admin
from .models import Useradmin.site.register(User)

创建数据库表:

python">python manage.py makemigrations
python manage.py migrate
2.8 用户认证

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

python">LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

创建登录视图:

python">from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginFormdef 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})

创建登出视图:

python">from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginFormdef 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
python">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_userapp = 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
python"><!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
python"><!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
python"><!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项目
python">django-admin startproject django_app
cd django_app
python manage.py startapp main
4.2.2 配置settings.py

在settings.py中添加应用:

python">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中定义模型:

python">from django.db import models
from django.contrib.auth.models import AbstractUserclass CustomUser(AbstractUser):pass

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

python">from django.contrib import admin
from .models import CustomUseradmin.site.register(CustomUser)
4.2.4 创建表单

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

python">from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from .models import CustomUserclass CustomUserCreationForm(UserCreationForm):class Meta(UserCreationForm.Meta):model = CustomUserfields = UserCreationForm.Meta.fields + ('email',)class CustomAuthenticationForm(AuthenticationForm):class Meta:model= CustomUserfields = ('username', 'password')
4.2.5 配置URL和视图

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

python">from django.shortcuts import render, redirect
from django.contrib.auth import login, logout
from .forms import CustomUserCreationForm, CustomAuthenticationFormdef 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:

python">from django.contrib import admin
from django.urls import path
from main import viewsurlpatterns = [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

python"><!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

python"><!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

python"><!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">python manage.py runserver

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

五、总结

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

作者:Rjdeng
链接:https://juejin.cn/post/7398747326070865929


http://www.ppmy.cn/embedded/102713.html

相关文章

qt 获取文件夹下及子文件夹所有exe文件

qt 获取文件夹下及子文件夹所有exe文件 &#xff0c;直接上代码 void findExeFiles(const QString &startDirectory) { QDir dir(startDirectory); // 文件过滤器&#xff0c;只选择.exe文件 dir.setFilter(QDir::Files | QDir::NoDotAndDotDot); dir.setNam…

如何从索尼相机/ SD卡恢复已删除的照片/视频

如果您不小心从 Sony 相机或 SD 卡中删除了照片或视频&#xff0c;仍有机会恢复它们。更快的方法是使用专用的恢复工具&#xff0c;例如奇客数据恢复&#xff0c;它将恢复所有丢失的文件。 如果您已从Sony相机/ SD卡/ Handycam / Cyber shot / Xperia设备中删除了照片或视频&a…

代码随想录Day 23|回溯Part02,39.组合总和、40.组合总和Ⅱ、131.分割回文串

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 第七章 回溯算法part03一、题目题目一&#xff1a; 39. 组合总和解题思路&#xff1a;回溯三部曲剪枝优化小结&#xff1a; 题目二&#xff1a;40.组合总和Ⅱ解题思路&#xff1a;回溯三部曲 题目…

Python进阶02-面向对象高级

零、文章目录 Python进阶02-面向对象高级 1、面向对象的三大特性 面向对象的三大特性&#xff1a;封装、继承、多态 ① 封装&#xff1a;将属性和方法书写到类的里面的操作即为封装&#xff0c;封装可以为属性和方法添加私有权限。② 继承&#xff1a;子类默认继承父类的所有…

全场景——(五)Modbus 协议细节

文章目录 一、Modbus协议概述二、Modbus寄存器&#xff08;存储区&#xff09;2.1 存储区类型2.2 协议地址模型 三、Modbus常用功能码四、Modbus协议类型五、Modbus报文帧5.1 Modbus ASCII 模式5.2 Modbus RTU 模式5.3 串行报文帧总结&#xff1a; 六、Modbus 差错校验6.1 LRC校…

代码零风险:深信达SDC沙盒如何革新源代码防泄漏

当前信息技术迅速发展的环境下&#xff0c;企业对源代码安全的高度重视。源代码作为企业最宝贵的资产之一&#xff0c;其安全性直接关系到企业的竞争力和市场地位。源代码泄露不仅可能导致企业技术优势的丧失&#xff0c;还可能引发严重的经济损失和法律风险。因此&#xff0c;…

常用git命令

目录 1、常用git命令 2、git merge 和 git rebase 的区别 3、获取远程仓库数据命令 git fetch 和 git pull的区别 4、git reset 和 git revert 的区别 1、常用git命令 git init //初始化本地仓库 git status //查看文件状态git diff //显示工作目录中当前文件…

Neo4j - CQL简介

简述 CQL 代表密码查询语言。就像 Oracle 数据库有查询语言 SQL&#xff0c;Neo4j 有 CQL 作为查询语言。 Neo4j CQL 是 Neo4j 图形数据库的查询语言。是一种声明性模式匹配语言。遵循类似 SQL 的语法。语法非常简单并且是人类可读的格式。 像 Oracle SQL Neo4j CQL 具有执…