Python网络编程:Web框架根本(Flask/Django)

十念  论坛元老 | 2024-8-22 13:46:24 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1030|帖子 1030|积分 3090

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

1.1 Flask简介

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

在安装Flask之前,确保你已经安装了Python。你可以利用以下命令来安装Flask:
  1. pip install Flask
复制代码
1.3 第一个Flask应用

创建一个名为app.py的文件,并添加以下代码:
  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def home():
  5.     return "Hello, Flask!"
  6. if __name__ == '__main__':
  7.     app.run(debug=True)
复制代码
运行应用:
  1. python app.py
复制代码
在欣赏器中访问http://127.0.0.1:5000/,你会看到“Hello, Flask!”的输出。
1.4 路由和视图函数

Flask通过路由将URL映射到视图函数。视图函数处理请求并返反响应。
  1. @app.route('/hello')
  2. def hello():
  3.     return "Hello, World!"
复制代码
你还可以利用URL变量:
  1. @app.route('/user/<name>')
  2. def user(name):
  3.     return f"Hello, {name}!"
复制代码
1.5 模板渲染

Flask利用Jinja2作为模板引擎。创建一个templates目次,并在其中创建一个名为index.html的文件:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <h1>{{ message }}</h1>
  8. </body>
  9. </html>
复制代码
修改视图函数以渲染模板:
  1. from flask import render_template
  2. @app.route('/')
  3. def home():
  4.     return render_template('index.html', message="Hello, Flask!")
复制代码
1.6 表单处理

Flask-WTF扩展提供了对表单处理的支持。首先安装Flask-WTF:
  1. pip install Flask-WTF
复制代码
创建一个表单类:
  1. from flask_wtf import FlaskForm
  2. from wtforms import StringField, SubmitField
  3. from wtforms.validators import DataRequired
  4. class NameForm(FlaskForm):
  5.     name = StringField('Name', validators=[DataRequired()])
  6.     submit = SubmitField('Submit')
复制代码
在视图函数中处理表单:
  1. from flask import Flask, render_template, flash, redirect, url_for
  2. from forms import NameForm
  3. app = Flask(__name__)
  4. app.config['SECRET_KEY'] = 'your_secret_key'
  5. @app.route('/', methods=['GET', 'POST'])
  6. def home():
  7.     form = NameForm()
  8.     if form.validate_on_submit():
  9.         flash(f'Hello, {form.name.data}!')
  10.         return redirect(url_for('home'))
  11.     return render_template('index.html', form=form
复制代码
在模板中渲染表单:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <form method="POST">
  8.         {{ form.hidden_tag() }}
  9.         {{ form.name.label }} {{ form.name() }}
  10.         {{ form.submit() }}
  11.     </form>
  12.     {% with messages = get_flashed_messages() %}
  13.     {% if messages %}
  14.     <ul>
  15.         {% for message in messages %}
  16.         <li>{{ message }}</li>
  17.         {% endfor %}
  18.     </ul>
  19.     {% endif %}
  20.     {% endwith %}
  21. </body>
  22. </html>
复制代码
1.7 数据库集成

Flask-SQLAlchemy扩展提供了对数据库的支持。首先安装Flask-SQLAlchemy:
  1. pip install Flask-SQLAlchemy
复制代码
设置数据库:
  1. from flask_sqlalchemy import SQLAlchemy
  2. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
  3. db = SQLAlchemy(app)
复制代码
定义模型:
  1. class User(db.Model):
  2.     id = db.Column(db.Integer, primary_key=True)
  3.     username = db.Column(db.String(80), unique=True, nullable=False)
  4.     email = db.Column(db.String(120), unique=True, nullable=False)
  5.     def __repr__(self):
  6.         return f'<User {self.username}>'
复制代码
创建数据库:
  1. python
  2. >>> from app import db
  3. >>> db.create_all()
复制代码
1.8 用户认证

Flask-Login扩展提供了对用户认证的支持。首先安装Flask-Login:
  1. pip install Flask-Login
复制代码
设置Flask-Login:
  1. from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
  2. login_manager = LoginManager()
  3. login_manager.init_app(app)
  4. login_manager.login_view = 'login'
  5. class User(UserMixin, db.Model):
  6.     # ...
  7. @login_manager.user_loader
  8. def load_user(user_id):
  9.     return User.query.get(int(user_id))
复制代码
定义登录视图:
  1. @app.route('/login', methods=['GET', 'POST'])
  2. def login():
  3.     form = LoginForm()
  4.     if form.validate_on_submit():
  5.         user = User.query.filter_by(username=form.username.data).first()
  6.         if user and user.check_password(form.password.data):
  7.             login_user(user)
  8.             return redirect(url_for('dashboard'))
  9.     return render_template('login.html', form=form)
复制代码
定义登出视图:
  1. @app.route('/logout')
  2. @login_required
  3. def logout():
  4.     logout_user()
  5.     return redirect(url_for('home'))
复制代码
二、Django根本

2.1 Django简介

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

你可以利用以下命令来安装Django:
  1. pip install Django
复制代码
2.3 创建Django项目

利用以下命令创建一个新的Django项目:
  1. django-admin startproject myproject
复制代码
进入项目目次:
  1. cd myproject
复制代码
2.4 应用与路由

在Django中,项目由多个应用组成。利用以下命令创建一个新的应用:
  1. python manage.py startapp myapp
复制代码
在settings.py中添加应用:
  1. INSTALLED_APPS = [
  2.     # ...
  3.     'myapp',
  4. ]
复制代码
设置路由:
  1. from django.contrib import admin
  2. from django.urls import path
  3. from myapp import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('', views.home, name='home'),
  7. ]
复制代码
定义视图:
  1. from django.shortcuts import render
  2. def home(request):
  3.     return render(request, 'home.html')
复制代码
2.5 模板渲染

Django利用Django模板引擎。创建一个templates目次,并在其中创建一个名为home.html的文件:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <h1>Welcome to Django</h1>
  8. </body>
  9. </html>
复制代码
2.6 表单处理

Django提供了强大的表单处理功能。创建一个表单类:
  1. from django import forms
  2. class NameForm(forms.Form):
  3.     name = forms.CharField(label='Your name', max_length=100)
复制代码
在视图中处理表单:
  1. from django.shortcuts import render, redirect
  2. from .forms import NameForm
  3. def home(request):
  4.     if request.method == 'POST':
  5.         form = NameForm(request.POST)
  6.         if form.is_valid():
  7.             # 处理数据
  8.             return redirect('success')
  9.     else:
  10.         form = NameForm()
  11.     return render(request, 'home.html', {'form': form})
复制代码
在模板中渲染表单:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <form method="post">
  8.         {% csrf_token %}
  9.         {{ form.as_p }}
  10.         <button type="submit">Submit</button>
  11.     </form>
  12. </body>
  13. </html>
复制代码
2.7 数据库操作

Django内置了ORM,可以轻松地进行数据库操作。定义模型:
  1. from django.db import models
  2. class User(models.Model):
  3.     username = models.CharField(max_length=80, unique=True)
  4.     email = models.EmailField(unique=True)
  5.     def __str__(self):
  6.         return self.username
复制代码
在admin.py中注册模型:
  1. from django.contrib import admin
  2. from .models import User
  3. admin.site.register(User)
复制代码
创建数据库表:
  1. python manage.py makemigrations
  2. python manage.py migrate
复制代码
2.8 用户认证

Django提供了内置的用户认证系统。在settings.py中设置登录URL:
  1. LOGIN_URL = '/login/'
  2. LOGIN_REDIRECT_URL = '/'
复制代码
创建登录视图:
  1. from django.contrib.auth import authenticate, login
  2. from django.shortcuts import render, redirect
  3. from .forms import LoginForm
  4. def login_view(request):
  5.     if request.method == 'POST':
  6.         form = LoginForm(request.POST)
  7.         if form.is_valid():
  8.             username = form.cleaned_data.get('username')
  9.             password = form.cleaned_data.get('password')
  10.             user = authenticate(request, username=username, password=password)
  11.             if user is not None:
  12.                 login(request, user)
  13.                 return redirect('home')
  14.     else:
  15.         form = LoginForm()
  16.     return render(request, 'login.html', {'form': form})
复制代码
创建登出视图:
  1. from django.contrib.auth import authenticate, login
  2. from django.shortcuts import render, redirect
  3. from .forms import LoginForm
  4. def login_view(request):
  5.     if request.method == 'POST':
  6.         form = LoginForm(request.POST)
  7.         if form.is_valid():
  8.             username = form.cleaned_data.get('username')
  9.             password = form.cleaned_data.get('password')
  10.             user = authenticate(request, username=username, password=password)
  11.             if user is not None:
  12.                 login(request, user)
  13.                 return redirect('home')
  14.     else:
  15.         form = LoginForm()
  16.     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

  1. from flask import Flask, render_template, redirect, url_for, flash
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_wtf import FlaskForm
  4. from wtforms import StringField, PasswordField, SubmitField
  5. from wtforms.validators import DataRequired
  6. from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
  7. app = Flask(__name__)
  8. app.config['SECRET_KEY'] = 'your_secret_key'
  9. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
  10. db = SQLAlchemy(app)
  11. login_manager = LoginManager(app)
  12. login_manager.login_view = 'login'
  13. class User(UserMixin, db.Model):
  14.     id = db.Column(db.Integer, primary_key=True)
  15.     username = db.Column(db.String(80), unique=True, nullable=False)
  16.     password = db.Column(db.String(120), nullable=False)
  17.     def __repr__(self):
  18.         return f'<User {self.username}>'
  19. @login_manager.user_loader
  20. def load_user(user_id):
  21.     return User.query.get(int(user_id))
  22. class RegisterForm(FlaskForm):
  23.     username = StringField('Username', validators=[DataRequired()])
  24.     password = PasswordField('Password', validators=[DataRequired()])
  25.     submit = SubmitField('Register')
  26. class LoginForm(FlaskForm):
  27.     username = StringField('Username', validators=[DataRequired()])
  28.     password = PasswordField('Password', validators=[DataRequired()])
  29.     submit = SubmitField('Login')
  30. @app.route('/')
  31. def home():
  32.     return render_template('home.html')
  33. @app.route('/register', methods=['GET', 'POST'])
  34. def register():
  35.     form = RegisterForm()
  36.     if form.validate_on_submit():
  37.         user = User(username=form.username.data, password=form.password.data)
  38.         db.session.add(user)
  39.         db.session.commit()
  40.         flash('You have been registered!', 'success')
  41.         return redirect(url_for('login'))
  42.     return render_template('register.html', form=form)
  43. @app.route('/login', methods=['GET', 'POST'])
  44. def login():
  45.     form = LoginForm()
  46.     if form.validate_on_submit():
  47.         user = User.query.filter_by(username=form.username.data).first()
  48.         if user and user.password == form.password.data:
  49.             login_user(user)
  50.             flash('Login successful!', 'success')
  51.             return redirect(url_for('home'))
  52.     return render_template('login.html', form=form)
  53. @app.route('/logout')
  54. @login_required
  55. def logout():
  56.     logout_user()
  57.     flash('You have been logged out.', 'info')
  58.     return redirect(url_for('home'))
  59. if __name__ == '__main__':
  60.     db.create_all()
  61.     app.run(debug=True)
复制代码
4.1.2 templates/home.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <h1>Welcome to Flask</h1>
  8.     {% if current_user.is_authenticated %}
  9.         <p>Hello, {{ current_user.username }}!</p>
  10.         <a href="{{ url_for('logout') }}">Logout</a>
  11.     {% else %}
  12.         <a href="{{ url_for('login') }}">Login</a>
  13.         <a href="{{ url_for('register') }}">Register</a>
  14.     {% endif %}
  15. </body>
  16. </html>
复制代码
4.1.3 templates/register.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Register</title>
  5. </head>
  6. <body>
  7.     <h1>Register</h1>
  8.     <form method="POST">
  9.         {{ form.hidden_tag() }}
  10.         {{ form.username.label }} {{ form.username() }}
  11.         {{ form.password.label }} {{ form.password() }}
  12.         {{ form.submit() }}
  13.     </form>
  14. </body>
  15. </html>
复制代码
4.1.4 templates/login.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Login</title>
  5. </head>
  6. <body>
  7.     <h1>Login</h1>
  8.     <form method="POST">
  9.         {{ form.hidden_tag() }}
  10.         {{ form.username.label }} {{ form.username() }}
  11.         {{ form.password.label }} {{ form.password() }}
  12.         {{ form.submit() }}
  13.     </form>
  14. </body>
  15. </html>
复制代码
4.2 Django综合示例

创建一个名为django_app的目次,并在其中创建以下文件:
4.2.1 创建Django项目

  1. django-admin startproject django_app
  2. cd django_app
  3. python manage.py startapp main
复制代码
4.2.2 设置settings.py

在settings.py中添加应用:
  1. INSTALLED_APPS = [
  2.     # ...
  3.     'main',
  4.     'django.contrib.sites',
  5.     'django.contrib.messages',
  6. ]
  7. MIDDLEWARE = [
  8.     # ...
  9.     'django.contrib.sessions.middleware.SessionMiddleware',
  10.     'django.middleware.common.CommonMiddleware',
  11.     'django.middleware.csrf.CsrfViewMiddleware',
  12.     'django.contrib.auth.middleware.AuthenticationMiddleware',
  13.     'django.contrib.messages.middleware.MessageMiddleware',
  14.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  15. ]
  16. TEMPLATES = [
  17.     {
  18.         'BACKEND': 'django.template.backends.django.DjangoTemplates',
  19.         'DIRS': [BASE_DIR / 'templates'],
  20.         'APP_DIRS': True,
  21.         'OPTIONS': {
  22.             'context_processors': [
  23.                 # ...
  24.                 'django.template.context_processors.request',
  25.             ],
  26.         },
  27.     },
  28. ]
  29. LOGIN_REDIRECT_URL = '/'
  30. LOGOUT_REDIRECT_URL = '/'
复制代码
4.2.3 创建模型

在main/models.py中定义模型:
  1. from django.db import models
  2. from django.contrib.auth.models import AbstractUser
  3. class CustomUser(AbstractUser):
  4.     pass
复制代码
在main/admin.py中注册模型:
  1. from django.contrib import admin
  2. from .models import CustomUser
  3. admin.site.register(CustomUser)
复制代码
4.2.4 创建表单

在main/forms.py中定义表单:
  1. from django import forms
  2. from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
  3. from .models import CustomUser
  4. class CustomUserCreationForm(UserCreationForm):
  5.     class Meta(UserCreationForm.Meta):
  6.         model = CustomUser
  7.         fields = UserCreationForm.Meta.fields + ('email',)
  8. class CustomAuthenticationForm(AuthenticationForm):
  9.     class Meta:
  10.         model
  11. = CustomUser
  12.         fields = ('username', 'password')
复制代码
4.2.5 设置URL和视图

在main/views.py中定义视图:
  1. from django.shortcuts import render, redirect
  2. from django.contrib.auth import login, logout
  3. from .forms import CustomUserCreationForm, CustomAuthenticationForm
  4. def home(request):
  5.     return render(request, 'home.html')
  6. def register(request):
  7.     if request.method == 'POST':
  8.         form = CustomUserCreationForm(request.POST)
  9.         if form.is_valid():
  10.             user = form.save()
  11.             login(request, user)
  12.             return redirect('home')
  13.     else:
  14.         form = CustomUserCreationForm()
  15.     return render(request, 'register.html', {'form': form})
  16. def login_view(request):
  17.     if request.method == 'POST':
  18.         form = CustomAuthenticationForm(request, data=request.POST)
  19.         if form.is_valid():
  20.             user = form.get_user()
  21.             login(request, user)
  22.             return redirect('home')
  23.     else:
  24.         form = CustomAuthenticationForm()
  25.     return render(request, 'login.html', {'form': form})
  26. def logout_view(request):
  27.     logout(request)
  28.     return redirect('home')
复制代码
在django_app/urls.py中设置URL:
  1. from django.contrib import admin
  2. from django.urls import path
  3. from main import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('', views.home, name='home'),
  7.     path('register/', views.register, name='register'),
  8.     path('login/', views.login_view, name='login'),
  9.     path('logout/', views.logout_view, name='logout'),
  10. ]
复制代码
4.2.6 创建模板

在项目根目次下创建一个templates目次,并在其中创建以下文件:
home.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home</title>
  5. </head>
  6. <body>
  7.     <h1>Welcome to Django</h1>
  8.     {% if user.is_authenticated %}
  9.         <p>Hello, {{ user.username }}!</p>
  10.         <a href="{% url 'logout' %}">Logout</a>
  11.     {% else %}
  12.         <a href="{% url 'login' %}">Login</a>
  13.         <a href="{% url 'register' %}">Register</a>
  14.     {% endif %}
  15. </body>
  16. </html>
复制代码
register.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Register</title>
  5. </head>
  6. <body>
  7.     <h1>Register</h1>
  8.     <form method="post">
  9.         {% csrf_token %}
  10.         {{ form.as_p }}
  11.         <button type="submit">Register</button>
  12.     </form>
  13. </body>
  14. </html>
复制代码
login.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Login</title>
  5. </head>
  6. <body>
  7.     <h1>Login</h1>
  8.     <form method="post">
  9.         {% csrf_token %}
  10.         {{ form.as_p }}
  11.         <button type="submit">Login</button>
  12.     </form>
  13. </body>
  14. </html>
复制代码
4.2.7 运行项目

运行项目:
  1. python manage.py runserver
复制代码
在欣赏器中访问http://127.0.0.1:8000/,你会看到Django应用的首页。
五、总结

通过本文的先容,我们了解了Flask和Django两个盛行的Python Web框架的根本知识。Flask作为一个轻量级框架,适合中小型项目,具有较高的机动性。Django作为一个功能全面的框架,适合大型复杂项目,内置了丰富的功能。通过综合示例,我们展示了怎样利用这两个框架构建Web应用,盼望读者可以或许根据自己的需求选择符合的框架,并在实际项目中加以应用。
   作者:Rjdeng
链接:https://juejin.cn/post/7398747326070865929

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表