Day08-Flask 或 Django 简介:构建 Web 应用程序

发布于:2025-07-09 ⋅ 阅读:(9) ⋅ 点赞:(0)

Flask 或 Django 简介:构建 Web 应用程序

网络开发领域提供了丰富的工具和框架,而 Python 作为一门多功能的语言,在构建健壮且可扩展的 Web 应用方面脱颖而出。本课程将作为你使用 Python 进行 Web 开发的入门指南,特别聚焦于两个流行的框架:Flask 和 Django。我们将探讨这些框架背后的基本概念,为你创建动态 Web 应用和 RESTful API 奠定基础。理解这些框架对于将 AI 模型集成到 Web 应用中至关重要,这是全栈 AI 开发的关键环节。

Web 框架简介:Flask 和 Django

Web 框架为构建 Web 应用程序提供结构,简化了路由、模板和数据库交互等常见任务。它们提供预构建的组件和工具,使开发者能够专注于应用程序的独特功能,而不是重新发明轮子。Flask 和 Django 是两个最流行的 Python Web 框架,每个都有其自身的优势和适用场景。

Flask:一个微框架

Flask 通常被描述为一个微框架,因为它只提供了构建 Web 应用所需的必要工具和库。它轻量级、灵活,并赋予开发者对其使用结构和组件的高度控制。

  • Flask 的主要功能:

    • 轻量级和灵活: Flask 的极简设计允许开发者选择他们需要的组件,使其非常适合小型项目或具有特定需求的应用。
    • 路由: Flask 的路由系统允许你将 URL 映射到特定的函数,从而轻松定义应用程序的不同端点。
    • 模板化: Flask 使用 Jinja2 作为其默认模板引擎,允许您通过在模板中嵌入 Python 代码来创建动态 HTML 页面。
    • WSGI 兼容性: Flask 是一个符合 WSGI(Web 服务器网关接口)规范的框架,这意味着它可以在多种 Web 服务器上部署。
    • 可扩展: Flask 的扩展系统允许您轻松地为应用程序添加功能,例如数据库集成、身份验证等。

    示例: 想象一下你正在构建一个简单的个人网站。Flask 的轻量级特性让你能够快速为你的主页、关于页面和联系表单设置路由,而无需承担大型框架的额外负担。

    反例: 如果你正在构建一个具有复杂用户管理、订单处理和产品目录的大型电子商务平台,与 Django 相比,Flask 可能需要更多的手动配置和外部库的集成。

Django:一个功能完备的框架

Django 是一个高级的 Python Web 框架,为构建复杂的 Web 应用程序提供了一套全面的工具和功能。它遵循“开箱即用”的理念,为用户认证、数据库管理和表单处理等常见任务提供了内置组件。

  • Django 的主要功能:

    • ORM(对象关系映射器): Django 的 ORM 允许你使用 Python 代码与数据库交互,抽象了 SQL 的复杂性。
    • 管理界面: Django 会自动生成一个管理界面,用于管理应用程序的数据,使创建、读取、更新和删除记录变得容易。
    • 安全特性: Django 包含内置的安全特性,例如防范跨站脚本(XSS)、跨站请求伪造(CSRF)和 SQL 注入。
    • 模板引擎: Django 有自己的模板引擎,它类似于 Jinja2,但有一些 Django 特有的功能。
    • 可扩展性: Django 被设计用来处理大量的流量和数据,因此它适合构建可扩展的 Web 应用程序。

    示例: 考虑构建一个社交网站。Django 的内置用户认证、数据库管理和安全功能将显著加快开发速度,并为复杂应用程序提供一个坚实的基础。

    反例: 如果你正在创建一个功能简单、单页面的应用程序,Django 的丰富功能可能会过于繁琐,而 Flask 可能是一个更合适的选择。

在 Flask 和 Django 之间进行选择

Flask 和 Django 之间的选择取决于你项目的具体需求。

特性 Flask Django
尺寸 微型框架 功能全面的框架
学习曲线 初始学习更简单 学习曲线更陡峭
灵活性 高度灵活,更多控制 灵活性较低,更具主观性
内置功能 极简,需要更多扩展 许多内置功能
用例 中小型应用程序,API 大型复杂应用程序,内容管理系统

假设场景: 你需要构建一个简单的 API 端点,从传感器接收数据并将其存储在数据库中。Flask 的简单性和灵活性使它成为这项任务的理想选择。你可以快速设置一个路由,使用 SQLAlchemy(我们稍后会介绍)连接到数据库,并处理数据。

设置开发环境

在开始使用 Flask 或 Django 构建 Web 应用程序之前,你需要设置一个开发环境。这通常涉及安装 Python、创建虚拟环境以及安装必要的包。

安装 Python

如果你还没有安装 Python,可以从官方 Python 网站(https://www.python.org/downloads/)下载。确保下载最新版的稳定版 Python 3。

创建虚拟环境

虚拟环境是一个自包含的目录,其中包含特定的 Python 解释器以及为特定项目安装的任何包。这有助于将您项目的依赖项与其他项目以及系统范围的 Python 安装隔离开来。

要创建虚拟环境,您可以使用 Python 3 自带的 venv 模块。

python3 -m venv venv

此命令在名为 venv 的目录中创建一个虚拟环境。

要激活虚拟环境,请使用以下命令:

  • 在 macOS 和 Linux 上:

    source venv/bin/activate
    
  • 在 Windows 上:

    venv\Scripts\activate
    

虚拟环境激活后,您的 shell 提示符将带有环境的名称作为前缀(例如,(venv))。

安装 Flask 或 Django

虚拟环境激活后,您可以使用 Python 包管理器 pip 安装 Flask 或 Django。

  • 要安装 Flask:

    pip install flask
    
  • 要安装 Django:

    pip install django
    

构建一个简单的"Hello, World!"应用程序

让我们使用 Flask 和 Django 创建一个基本的"Hello, World!"应用程序,以说明每个框架的基本概念。

Flask “你好,世界!”

  1. 创建一个名为 app.py 的文件:

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

    解释:

    • from flask import Flask: 从 flask 包中导入 Flask 类。
    • app = Flask(__name__): 创建 Flask 类的实例。__name__ 参数是一个特殊的 Python 变量,表示当前模块的名称。
    • @app.route('/'): 这是一个装饰器,告诉 Flask 哪个 URL 应该触发我们的函数。在这种情况下,/ URL(根 URL)将触发 hello_world() 函数。
    • def hello_world():: 当访问 / URL 时,这个函数会被调用。它返回字符串 ‘Hello, World!’,这个字符串将在浏览器中显示。
    • if __name__ == '__main__':: 这是一个标准的 Python 惯用法,确保只有在脚本直接运行时(而不是作为模块导入时)才会执行 app.run() 这一行。
    • app.run(debug=True): 启动 Flask 开发服务器。参数 debug=True 启用调试模式,提供有用的错误信息,并在你修改代码时自动重新加载服务器。
  2. 运行应用程序:

    python app.py
    

    这将启动 Flask 开发服务器。打开你的网页浏览器并前往 http://127.0.0.1:5000/(或终端中显示的地址)。你应该能看到"Hello, World!"消息。

Django “你好,世界!”

  1. 创建一个新的 Django 项目:

    django-admin startproject helloworld
    cd helloworld
    

    这会创建一个名为 helloworld 的新 Django 项目。

  2. 创建一个新的 Django 应用:

    python manage.py startapp hello
    

    这会创建一个名为 hello 的新 Django 应用。

  3. 编辑 helloworld/settings.py:

    在 INSTALLED_APPS 列表中添加 'hello'

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'hello',  # Add this line
    ]
    
  4. 创建一个名为 hello/views.py 的文件:

    from django.http import HttpResponse
    
    def hello_world(request):
        return HttpResponse("Hello, World!")
    

    解释:

    • from django.http import HttpResponse : 导入 HttpResponse 类,该类用于向客户端发送 HTTP 响应。
    • def hello_world(request):: 当我们下一步定义的 URL 收到请求时,这个函数会被调用。它接受一个 request 对象作为参数,该对象包含了关于请求的信息。
    • return HttpResponse("Hello, World!") : 这行代码创建了一个 HttpResponse 对象,其内容为字符串"Hello, World!",并将其返回。这将作为发送给浏览器的响应。
  5. 创建一个名为 hello/urls.py 的文件:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.hello_world, name='hello_world'),
    ]
    

    解释:

    • from django.urls import path: 导入 path 函数,该函数用于定义 URL 模式。
    • from . import views: 从当前目录(即 hello 应用)导入 views 模块。
    • urlpatterns = [...]: 这个列表定义了 hello 应用的 URL 模式。
    • path('', views.hello_world, name='hello_world') : 这行代码定义了一个 URL 模式,将根 URL('')映射到 hello_world 视图函数,该函数位于 views 模块中。name 参数用于为 URL 模式命名,该名称可用于在模板和其他代码部分中引用它。
  6. 编辑 helloworld/urls.py:

    包含 hello 应用的 URLs:

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('hello.urls')),  # Add this line
    ]
    

    解释:

    • from django.urls import include, path : 导入 include 函数,用于包含其他应用中的 URL 模式。
    • path('', include('hello.urls')) : 这行代码包含了在 hello/urls.py 文件中定义的 URL 模式。这意味着所有以 / 开头的 URL 都将由 hello 应用处理。
  7. 运行迁移:

    python manage.py migrate
    

    此命令应用任何待处理的数据库迁移。由于我们尚未定义任何模型,这将仅创建默认的 Django 表。

  8. 运行开发服务器:

    python manage.py runserver
    

    这将启动 Django 开发服务器。打开你的网页浏览器并前往 http://127.0.0.1:8000/。你应该能看到"Hello, World!"的消息。

路由和 URL 处理

路由是将 URL 映射到 Web 应用程序中特定函数或视图的过程。Flask 和 Django 都提供了定义路由和处理 URL 参数的机制。

Flask 路由

在 Flask 中,你使用 @app.route() 装饰器来定义路由。该装饰器以一个 URL 模式作为参数,并将其与一个函数关联起来。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Index Page'

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

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return f'User {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return f'Post {post_id}'

解释:

  • @app.route('/'): 将根 URL(/)映射到 index() 函数。
  • @app.route('/hello'): 将 /helloURL 映射到 hello() 函数。
  • @app.route('/user/<username>') : 将类似 /user/john 或 /user/jane 的 URL 映射到 show_user_profile() 函数。<username> 部分是一个变量,将被作为参数传递给函数。
  • @app.route('/post/<int:post_id>') : 将类似 /post/123 或 /post/456 的 URL 映射到 show_post() 函数。其中 <int:post_id> 部分是一个变量,它将被作为整数参数传递给该函数。而 int: 部分则指定该变量应为整数。

Django URL 处理

在 Django 中,你使用 urls.py 文件中的 path() 函数来定义 URL 模式。path() 函数接受一个 URL 模式、一个视图函数和一个可选的名称作为参数。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('hello/', views.hello, name='hello'),
    path('user/<str:username>/', views.show_user_profile, name='show_user_profile'),
    path('post/<int:post_id>/', views.show_post, name='show_post'),
]

解释:

  • path('', views.index, name='index') : 将根 URL(/)映射到 index 视图函数。
  • path('hello/', views.hello, name='hello') : 将 /hello/URL 映射到 hello 视图函数。
  • path('user/<str:username>/', views.show_user_profile, name='show_user_profile') : 将类似 /user/john/ 或 /user/jane/ 的 URL 映射到 show_user_profile 视图函数。其中 <str:username> 部分是一个变量,将被作为字符串参数传递给该函数。
  • path('post/<int:post_id>/', views.show_post, name='show_post') : 将类似 /post/123/ 或 /post/456/ 的 URL 映射到 show_post 视图函数。 <int:post_id> 部分是一个变量,它将被作为整数参数传递给该函数。

模板化

模板化允许您通过在模板中嵌入 Python 代码来创建动态 HTML 页面。Flask 和 Django 都有自己的模板引擎。

Flask 模板(Jinja2)

Flask 使用 Jinja2 作为其默认模板引擎。Jinja2 允许你在模板中使用变量、循环和条件语句。

  1. 在您的 templates 文件与 app.py 文件相同的目录下创建一个名为 templates 的目录。

  2. 在 templates 目录下创建一个名为 index.html 的文件:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Flask Template Example</title>
    </head>
    <body>
        <h1>Hello, {{ name }}!</h1>
        <p>Welcome to my website.</p>
    </body>
    </html>
    

    解释:

    • {{ name }}: 这是一个 Jinja2 变量,它将被从 Python 代码中传递过来的 name 变量的值所替换。
  3. 修改你的 app.py 文件:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/template/<name>')
    def index(name):
        return render_template('index.html', name=name)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    解释:

    • from flask import Flask, render_template : 导入 render_template 函数,该函数用于渲染 Jinja2 模板。
    • return render_template('index.html', name=name) : 这行代码渲染了 index.html 模板,并将 name 变量传递给模板。
  4. 运行应用程序:

    python app.py
    

    打开你的网页浏览器并前往 http://127.0.0.1:5000/template/John 。你应该能看到 “Hello, John!” 的消息。

Django 模板

Django 有自己的模板引擎,它类似于 Jinja2,但有一些 Django 特有的功能。

  1. 在你的 hello 应用目录中创建一个名为 templates 的目录。

  2. 在 templates 目录下创建一个名为 index.html 的文件:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Django Template Example</title>
    </head>
    <body>
        <h1>Hello, {{ name }}!</h1>
        <p>Welcome to my website.</p>
    </body>
    </html>
    

    解释:

    • {{ name }}: 这是一个 Django 模板变量,它将被从 Python 代码中传递过来的 name 变量的值所替换。
  3. 修改你的 hello/views.py 文件:

    from django.shortcuts import render
    
    def index(request, name):
        return render(request, 'index.html', {'name': name})
    

    解释:

    • from django.shortcuts import render : 导入 render 函数,该函数用于渲染 Django 模板。
    • return render(request, 'index.html', {'name': name}) : 这行代码渲染了 index.html 模板,并将 name 变量传递给模板。
  4. 修改你的 hello/urls.py 文件:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('template/<str:name>/', views.index, name='index'),
    ]
    
  5. 运行开发服务器:

    python manage.py runserver
    

    打开你的网页浏览器并前往 http://127.0.0.1:8000/template/John/ 。你应该能看到 “Hello, John!” 的消息。


网站公告

今日签到

点亮在社区的每一天
去签到