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 之间的选择取决于你项目的具体需求。

特性FlaskDjango
尺寸微型框架功能全面的框架
学习曲线初始学习更简单学习曲线更陡峭
灵活性高度灵活,更多控制灵活性较低,更具主观性
内置功能极简,需要更多扩展许多内置功能
用例中小型应用程序,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 Flaskapp = 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 HttpResponsedef 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 viewsurlpatterns = [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, pathurlpatterns = [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 Flaskapp = 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 userreturn 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 integerreturn 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 viewsurlpatterns = [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_templateapp = 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 renderdef 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 viewsurlpatterns = [path('template/<str:name>/', views.index, name='index'),
    ]
    
  5. 运行开发服务器:

    python manage.py runserver
    

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87964.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87964.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87964.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s多集群管理中的联邦和舰队如何理解?

在 Kubernetes 多集群管理中&#xff0c;联邦&#xff08;Federation&#xff09;和舰队&#xff08;Fleet&#xff09;是两种不同的方法&#xff0c;用于管理和协调多个 Kubernetes 集群。下面是对这两种方法的详细解释&#xff1a; 联邦&#xff08;Federation&#xff09; K…

Docker部署MySQL镜像

1.拉取镜像 # 拉取指定版本的MySQL镜像 docker pull mysql:8.02.创建挂载目录 # 自己创建好如下三个文件夹 路径任意 [rootiZuf6aigs7rxe6f6oifq7vZ mysql]# ll 总用量 12 drwxr-xr-x 2 root root 4096 7月 7 10:25 config drwxr-xr-x 2 root root 4096 6月 26 16:43 data d…

【网络】Linux 内核优化实战 - net.ipv4.ip_local_reserved_ports

目录一、参数作用二、默认值与格式三、典型应用场景四、配置方法五、注意事项六、查看当前配置在Linux系统的TCP/IP网络配置中&#xff0c;net.ipv4.ip_local_reserved_ports 是一个关键内核参数&#xff0c;用于指定禁止系统自动分配的本地端口范围。这些端口会被“预留”出来…

期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​

VR 森林体验模拟&#xff0c;无疑是科技与自然领域一次极具开创性意义的奇妙碰撞。它借助前沿的虚拟现实技术&#xff0c;以别出心裁、独树一帜的方式&#xff0c;为我们精心打造并带来了一场前所未有的森林探索奇幻之旅 。​在教育领域&#xff0c;于中小学的自然科学课堂上&a…

Qt:QLabel、LCD Number、QProgressBar、QCalendarWidget

目录 一、QLabel 1.属性 2.设置文本格式 3.设置图片 4.设置文本对齐方式 5.设置自动换行 6.设置缩进 7.设置边距 8.设置伙伴关系 二、LCD Number 1.属性 2.Qt仅允许主线程修改界面 三、QProgressBar 属性 四、QCalendarWidget 属性 一、QLabel 同样的&#x…

打造可靠的云基础架构:Azure 区域与可用性区域

随着企业业务的全球化扩展和数字化转型&#xff0c;可靠性已成为企业在选择云平台时的重要考量因素。Azure 作为全球领先的云计算服务提供商&#xff0c;通过区域&#xff08;Regions&#xff09;和可用性区域&#xff08;Availability Zones&#xff09;为企业构建高可用性、高…

订单初版—1.分布式订单系统的简要设计文档

大纲1.订单系统核心业务流程2.Spring Cloud Alibaba在订单业务中的落地方案3.面向分布式全链路故障设计的高可靠架构方案4.分布式订单系统的技术栈与代码规范1.订单系统核心业务流程(1)生成订单时序图(2)支付订单流程图(3)取消订单流程图这里主要介绍生单和退款两个核心链路&am…

【HarmonyOS】富文本编辑器RichEditor详解

【HarmonyOS】富文本编辑器RichEditor详解 一、前言 在信息化高速发展的今天&#xff0c;普通的文本容器&#xff0c;已经不能够承载用户丰富的表达欲。富文本展示已经是移动开发中&#xff0c;必备要解决的问题&#xff0c;在鸿蒙中&#xff0c;通过在系统层提供RichEditor控件…

【MySQL进阶】在一台机器上运行多个MySQL实例

目录 1.使用MySQL Installer安装MySQL实例 1.1.去官网下载MySQL Installer 1.2.停止mysql服务 1.3.为不同的版本指定不同的安装目录 2.配置不同版本的选项文件 2.1.修改数据目录 2.2.修改基本目录 2.3.修改端口号 2.4.设置⽇志⽬录 2.5.配置临时目录 2.6.修改绑定地…

verilog中timescale指令的使用

1.timescale指令格式timescale <时间单位> / <时间精度>时间单位&#xff1a;它确定了仿真中时间值的基本单位。比如 1ns 就意味着时间值是以纳秒为单位来计量的。 时间精度&#xff1a;该参数决定了时间值能够表示的最小分辨率。例如 1ps 表示时间可以精确到皮秒级…

08_Excel 导入 - 用户信息批量导入

08_Excel 导入 - 用户信息批量导入 1. VO 类 java复制编辑Data AllArgsConstructor NoArgsConstructor public class UserInfoBatch4ExcelReq {ExcelProperty(value "用户姓名")Schema(description "用户姓名")private String userName;ExcelProperty(va…

【深度学习新浪潮】什么是世界模型?

世界模型(World Model)是人工智能领域中一类通过构建环境的抽象表示来理解和预测外部世界的系统。它通过整合多模态数据(如视觉、语言、传感器信号)形成对环境的动态认知,并支持智能体在复杂场景中进行决策与规划。以下从核心概念、解决的问题、关键研究、技术路线、现状与…

React + Express 传输加密以及不可逆加密

一、传输加密这里用 对称加密模式 ASE实现。React 前端const CryptoJS require("crypto-js");// 示例1&#xff1a;ECB模式&#xff08;无需IV&#xff09; const encryptECB (plainText, key) > {return CryptoJS.AES.encrypt(plainText, key, {mode: CryptoJS…

浏览器(Chrome /Edge)高效使用 - 内部命令/快捷键/启动参数

今天在CSDN上传文件,提交总是提示续传失败,重试了五六次才想到获取是科学上网的问题,这个时候其实只要重启浏览器即可,但如果手动关闭浏览器再次打开,浏览器不会恢复之前的多开窗口(会恢复最后一个窗口内多开的标签页,但不会恢复其他窗口)。想了想记得 Chrome 流行的时…

【PTA数据结构 | C语言版】连续子序列最大和

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录 题目代码 题目 给定 n 个整数组成的序列 { a1 ,a2 ,⋯,an }&#xff0c;“连续子序列”被定义为 { ai ,ai1 ,⋯,aj }&#xff0c;其中 1≤i≤j≤n。“连续子序列最大和”则被定义为所有连续子序列元素的和中最大…

Vrrp配置和原理

Vrrp配置和原理 文章目录Vrrp配置和原理概述物理与逻辑拓扑重点vrid虚拟路由器虚拟IP地址及虚拟MAC地址超时时间计算-MASTER_DOWNvip 管理员手动指定方法Master路由器Backup路由器PriorityVRRP报文格式VRRP状态机从Backup到masterVRRP协议状态二.优先级一样比较接口IPVRRP优先级…

可编辑59页PPT | 某大型集团人工智能数字化转型SAP解决方案

荐言摘要&#xff1a;某大型集团人工智能数字化转型中&#xff0c;SAP解决方案扮演着智能中枢角色&#xff0c;深度融合AI技术与核心业务场景&#xff0c;破解传统系统“数据孤岛流程僵化”双重困局。针对集团跨产业、多业态特点&#xff0c;方案以SAP S/4HANA为数据底座&#…

【RK3568 驱动开发:实现一个最基础的网络设备】

RK3568 驱动开发&#xff1a;实现一个最基础的网络设备一、引言二、编写网络设备驱动代码1. 核心数据结构与接口2. 核心功能实现3. 网络命名空间管理4.源代码三、编译与验证1.加载模块2.验证网络四、注意事项一、引言 RK3568 作为一款高性能 ARM 架构处理器&#xff0c;广泛应…

CAIDCP系列对话:AI 驱动安全

数字时代&#xff0c;AI浪潮翻涌&#xff0c;网络安全攻防战已悄然升级&#xff1a; 某工业控制系统遭AI驱动勒索攻击&#xff1a;攻击者借 AI 精准捕捉异常网络扫描、远程 PowerShell 痕迹&#xff0c;瞬间加密文件索要赎金&#xff1b; 另一边&#xff0c;某大型科技公司用AI…

ARMv8 没开mmu执行memset引起的非对齐访问异常

最近在haps上验证一个新的芯片&#xff0c;记录一下memset访问出错的问题。在没开mmu和cache的情况下&#xff0c;对全局变量指针进行memset清零操作&#xff0c;发现每次都会出现异常。最后发现是没开mmu导致出现了数据非对齐访问导致报错。排查EC区域发现是0x25&#xff0c;产…