赞
踩
Python作为一种功能强大且易于使用的编程语言,广泛应用于Web开发领域。Python的丰富生态系统中,有两个非常流行的Web框架:Flask和Django。本博文将详细介绍这两个框架的基础知识,并通过综合示例展示如何使用它们构建Web应用。
Flask是一个轻量级的Web框架,设计简单且易于扩展。Flask遵循WSGI标准,采用模块化设计,允许开发者根据需要选择和配置组件。
在安装Flask之前,确保你已经安装了Python。你可以使用以下命令来安装Flask:
pip install 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!”的输出。
Flask通过路由将URL映射到视图函数。视图函数处理请求并返回响应。
- @app.route('/hello')
- def hello():
- return "Hello, World!"
你还可以使用URL变量:
- @app.route('/user/<name>')
- def user(name):
- return f"Hello, {name}!"
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!")
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>

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()
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是一个功能全面的Web框架,提供了内置的ORM、表单处理、用户认证、管理后台等功能,适合开发大型复杂的Web应用。
你可以使用以下命令来安装Django:
pip install Django
使用以下命令创建一个新的Django项目:
django-admin startproject myproject
进入项目目录:
cd myproject
在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')
Django使用Django模板引擎。创建一个templates目录,并在其中创建一个名为home.html的文件:
- <!DOCTYPE html>
- <html>
- <head>
- <title>Home</title>
- </head>
- <body>
- <h1>Welcome to Django</h1>
- </body>
- </html>
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>
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
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是一个微框架,灵活性高,适用于中小型项目。它提供了基本的Web开发功能,开发者可以根据需求选择合适的扩展库。
Django是一个功能全面的框架,适用于大型项目。它内置了ORM、表单处理、身份验证、管理后台等功能,减少了开发者的工作量。
Flask的学习曲线较为平缓,适合初学者快速上手。其简单易懂的设计理念使得开发者能够快速构建Web应用。
Django的学习曲线相对陡峭,但其强大的功能和一致的设计使得开发大型项目变得更加高效。一旦掌握了Django,开发者能够在短时间内构建功能丰富的Web应用。
Flask和Django都有活跃的社区和丰富的文档。Flask的文档简洁明了,Django的文档详尽全面,开发者可以根据需求选择合适的框架。
创建一个名为flask_app的目录,并在其中创建以下文件:
- 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)

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

- <!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>
- <!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>
创建一个名为django_app的目录,并在其中创建以下文件:
- django-admin startproject django_app
- cd django_app
- python manage.py startapp main
在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 = '/'

在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)
在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')
在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'),
- ]
在项目根目录下创建一个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>
运行项目:
python manage.py runserver
在浏览器中访问http://127.0.0.1:8000/,你会看到Django应用的首页。
通过本文的介绍,我们了解了Flask和Django两个流行的Python Web框架的基础知识。Flask作为一个轻量级框架,适合中小型项目,具有较高的灵活性。Django作为一个功能全面的框架,适合大型复杂项目,内置了丰富的功能。通过综合示例,我们展示了如何使用这两个框架构建Web应用,希望读者能够根据自己的需求选择合适的框架,并在实际项目中加以应用。
作者:Rjdeng
链接:https://juejin.cn/post/7398747326070865929
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。