白骑士的Python教学高级篇 3.4 Web开发

系列目录

上一篇:白骑士的Python教学高级篇 3.3 数据库编程

        在现代软件开发中,Web开发占据了重要的一席之地。通过Web开发,我们可以创建从简单的个人博客到复杂的电子商务网站等各种应用。在Python的生态系统中,Flask和Django是两个非常流行的Web框架,它们各自有着独特的优点和使用场景。此外,理解前后端交互也是Web开发中不可或缺的一部分。本文将详细介绍Flask和Django的基础知识,并探讨前后端交互的基本概念。

Flask入门

        Flask是一个轻量级的Web框架,由Armin Ronacher开发。它被设计成一个微框架,核心非常简洁,只包含了Web服务器和模板引擎两个最基本的功能,其它功能通过扩展来实现。Flask的灵活性和简洁性使其成为快速开发小型应用和API的理想选择。

安装Flask

        安装Flask非常简单,可以通过Python的包管理工具pip来安装:

pip install Flask

创建一个简单的Flask应用

        以下是一个简单的Flask应用示例:

from flask import Flask


app = Flask(__name__)

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


if __name__ == '__main__':
    app.run(debug=True)

        这个示例展示了如何创建一个最简单的Flask应用,并定义了一个路由 ‘/’,当访问根路径时,将返回"Hello, World!"。

路由与视图函数

        在Flask中,路由决定了URL与视图函数的对应关系。视图函数是处理请求并返回响应的函数。通过 ‘@app.route’ 装饰器,我们可以将特定的URL与视图函数绑定,例如:

@app.route('/hello/<name>')
def hello(name):
    return f'Hello, {name}!'

        在这个例子中,访问 ‘/hello/<name>’ 时,视图函数 ‘hello’ 会接收URL中的 ‘name’ 参数,并返回一个包含该参数的字符串。

模板渲染

        Flask使用Jinja2作为其模板引擎,模板引擎允许我们在HTML中嵌入动态内容。下面是一个简单的示例,展示如何使用模板:

        创建一个模板文件 'templates/hello.html':

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

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

from flask import render_template


@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

        通过这种方式,我们可以将动态内容传递给模板,并生成相应的HTML页面。

表单处理与请求数据

        Flask提供了方便的方式来处理表单数据和请求数据。以下是一个简单的示例,展示如何处理POST请求中的表单数据:

        创建一个表单模板 'templates/form.html':

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>
    <form action="/submit" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

        定义视图函数以处理表单提交:

from flask import request


@app.route('/submit', methods=['POST'])
def submit():
    name = request.form['name']
    return f'Hello, {name}!'

        通过这种方式,我们可以方便地接收并处理来自客户端的表单数据。

Django基础

        Django是一个功能强大的Web框架,由Adrian Holovaty和Simon Willison于2003年创建,旨在简化Web开发过程。与Flask的轻量级设计不同,Django是一个“重量级”的框架,包含了Web开发所需的所有功能,从数据库操作到用户认证,再到管理后台,几乎一应俱全。

安装Django

        同样,可以通过pip来安装Django,命令如下:

pip install django

创建Django项目

        创建一个新的Django项目非常简单,例如:

django-admin startproject mysite

        进入项目目录并启动开发服务器:

cd mysite
python manage.py runserver

        在浏览器中访问 ‘http://127.0.0.1:8000/’,你将看到Django的欢迎页面,表示项目已经成功创建并运行。

创建Django应用

        Django项目通常由多个应用组成,每个应用负责一个特定的功能模块。创建一个新的应用,例如:

python manage.py startapp myapp

定义模型

        Django的强大之处在于其ORM(对象关系映射)系统,它允许开发者通过Python代码来定义和操作数据库。以下是一个简单的模型示例:

        在`myapp/models.py`中定义一个模型:

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

    def __str__(self):
        return self.name

迁移数据库

        在定义模型后,需要将模型同步到数据库。首先,生成迁移文件,例如:

python manage.py makemigrations

        然后,应用迁移:

python manage.py migrate

定义视图与URL

        在Django中,视图函数处理请求并返回响应。以下是一个简单的视图函数示例:

        在 ‘myapp/views.py’ 中定义视图函数:

from django.http import HttpResponse


def hello(request):
    return HttpResponse('Hello, World!')

        然后,在`myapp/urls.py`中定义URL模式:

from django.urls import path
from . import views


urlpatterns = [
    path('hello/', views.hello, name='hello'),
]

        最后,在项目的主URL配置文件`mysite/urls.py`中包含应用的URL配置:

from django.contrib import admin
from django.urls import include, path


urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
]

模板渲染

        Django使用其内置的模板引擎来渲染HTML。以下是一个简单的模板示例:

        创建一个模板文件 ‘myapp/templates/myapp/hello.html’:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

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

from django.shortcuts import render


def hello(request):
    return render(request, 'myapp/hello.html', {'name': 'World'})

        通过这种方式,我们可以将动态内容传递给模板,并生成相应的HTML页面。

表单处理

        Django提供了强大的表单处理功能,包括表单验证和CSRF保护。以下是一个简单的示例,展示如何处理表单数据:

        在 ‘myapp/forms.py’ 中定义一个表单类:

from django import forms


class NameForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)

        在 ’myapp/views.py‘ 中定义视图函数以处理表单提交:

from django.shortcuts import render
from .forms import NameForm


def get_name(request):
    if request.method == 'POST':
        form = NameForm(request.POST)

        if form.is_valid():
            name = form.cleaned_data['name']

            return HttpResponse(f'Hello, {name}!')

    else:
        form = NameForm()

    return render(request, 'myapp/name.html', {'form': form})

        创建一个模板文件 ‘myapp/templates/myapp/name.html’:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Submit">
    </form>
</body>
</html>

        通过这种方式,我们可以方便地接收并处理来自客户端的表单数据。

前后端交互

        在现代Web开发中,前后端交互是实现动态功能和提升用户体验的关键。前端主要负责呈现用户界面,而后端负责处理数据和业务逻辑。通过API,前后端可以进行数据交换和交互。

RESTful API

        RESTful API是一种常见的前后端交互方式,基于HTTP协议,使用标准的HTTP方法(如GET、POST、PUT、DELETE)进行操作。以下是一个简单的RESTful API示例,使用Flask实现:

from flask import Flask, jsonify, request


app = Flask(__name__)
items = []

@app.route('/items', methods=['GET'])
def get_items():
    return jsonify(items)


@app.route('/items', methods=['POST'])
def add_item():
    item = request.json
    items.append(item)
    return jsonify(item), 201


@app.route('/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = request.json
    items[item_id] = item
    return jsonify(item)


@app.route('/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    item = items.pop(item_id)
    return jsonify(item)


if __name__ == '__main__':
    app.run(debug=True)

AJAX与前端框架

        为了实现动态交互,前端通常使用AJAX(Asynchronous JavaScript and XML)技术,结合前端框架如React、Vue.js或Angular,向后端API发送请求并更新页面内容。

        以下是一个使用JavaScript和AJAX实现简单前后端交互的示例:

        HTML文件:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AJAX Example</title>
    <script>
        function loadItems() {
            fetch('/items')
                .then(response => response.json())
                .then(data => {
                    const list = document.getElementById('item-list');
                    list.innerHTML = '';
                    data.forEach(item => {
                        const li = document.createElement('li');
                        li.textContent = item.name;
                        list.appendChild(li);
                    });
                });
        }

        function addItem() {
            const itemName = document.getElementById('item-name').value;
            fetch('/items', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({name: itemName})
            })
                .then(response => response.json())
                .then(item => {
                    const list = document.getElementById('item-list');
                    const li = document.createElement('li');
                    li.textContent = item.name;
                    list.appendChild(li);
                });
        }

        document.addEventListener('DOMContentLoaded', loadItems);
    </script>
</head>
<body>
    <h1>Items</h1>
    <ul id="item-list"></ul>
    <input type="text" id="item-name" placeholder="Item name">
    <button onclick="addItem()">Add Item</button>
</body>
</html>

        这个示例展示了如何使用AJAX与后端API进行交互,动态加载和添加数据。

使用前端框架

        使用现代前端框架可以进一步简化前后端交互和提升开发效率。以下是一个使用Vue.js实现前后端交互的示例:

        HTML文件:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue.js Example</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            new Vue({
                el: '#app',
                data: {
                    items: [],
                    newItem: ''
                },
                mounted() {
                    this.loadItems();
                },
                methods: {
                    loadItems() {
                        axios.get('/items')
                            .then(response => {
                                this.items = response.data;
                            });
                    },
                    addItem() {
                        axios.post('/items', {name: this.newItem})
                            .then(response => {
                                this.items.push(response.data);
                                this.newItem = '';
                            });
                    }
                }
            });
        });
    </script>
</head>
<body>
    <div id="app">
        <h1>Items</h1>
        <ul>
            <li v-for="item in items" :key="item.id">{{ item.name }}</li>
        </ul>
        <input type="text" v-model="newItem" placeholder="Item name">
        <button @click="addItem">Add Item</button>
    </div>
</body>
</html>

        通过这种方式,我们可以使用Vue.js的简洁语法和强大的双向数据绑定特性,更加高效地实现前后端交互。

总结

        通过学习Flask和Django两个流行的Python Web框架,以及理解前后端交互的基本概念,我们可以掌握Web开发的核心技能。Flask的轻量级和灵活性使其适合快速开发和小型项目,而Django的全面功能和强大生态系统则非常适合构建复杂的大型应用。前后端交互是实现动态和高效Web应用的关键,通过RESTful API和现代前端框架,我们可以构建出具有优秀用户体验的Web应用。希望本文能够帮助你在Web开发的道路上迈出坚实的一步。

下一篇:白骑士的Python教学实战项目篇 4.1 数据分析与可视化​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

洗地机品牌哪个最好用?硬核推荐五大实力爆款洗地机

在这个忙碌的时代&#xff0c;家就是我们放松的港湾&#xff0c;但要保持它的清洁与舒适常常很不容易。每天拖着疲惫的身体回家&#xff0c;还要面对地板上那些难缠的灰尘、污渍&#xff0c;真是非常让人头疼。不过&#xff0c;洗地机的出现就像是给家务清洁装上了智能引擎&…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

一篇文章带你完全理解C语言数组

文章目录 1.一维数组的创建和初始化数组的创建1.2数组的初始化1.3 一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1 冒泡排序函数的错…

从零开始开发美颜SDK:打造属于平台的主播美颜工具

本篇文章&#xff0c;小编将从零开始&#xff0c;介绍如何打造一款属于平台的主播美颜工具。 一、需求分析 首先&#xff0c;明确开发美颜SDK的需求是至关重要的。当前市场上&#xff0c;美颜工具的功能主要包括&#xff1a; 1.实时美颜&#xff1a;磨皮、美白、瘦脸等基础功…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可以用于多种上…

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索&#xff0c;这些项目具体信息会发布到知识星球&#xff0c;请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…

时钟系统框图(时钟树)解析

时钟系统框图&#xff08;时钟树&#xff09;解析 文章目录 时钟系统框图&#xff08;时钟树&#xff09;解析1、时钟树2、 4个时钟源&#xff1a;$HSI、HSE、LSI、LSE$3、PLL锁相环倍频输出4、系统时钟的来源5、Enable CSS&#xff08;时钟监视系统&#xff09;6、几个重要的时…

微信开发者工具使用

1.下载微信开发者工具 https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 2.下载小程序项目代码 3.用微信开发者工具导入项目代码 4.npm安装依赖 5.构建 6.修改测试环境 7.清除缓存 观察切换test后&#xff0c;登录时是否test字样提醒&#xff0c;若…

使用Python+OpenCV实现姿态估计--20240705

姿态估计使用Opencv+Mediapipe来时实现 什么是Mediapipe? Mediapipe是主要用于构建多模式音频,视频或任何时间序列数据的框架。借助MediaPipe框架,可以构建令人印象深刻的ML管道,例如TensorFlow,TFLite等推理模型以及媒体处理功能。 安装命令: pip install mediapipe如果…

大模型提示词工程和落地思考

本文是一篇内部的个人分享&#xff08;已无敏感信息&#xff09; &#xff0c;目的是增加产品、开发同学对 LLM 的理解&#xff0c;以降低沟通中的阻力&#xff0c;更好推进落地。 以下经脱敏后的原文: 大模型并不神奇 很多人听到’大模型’这个词可能会觉得很神秘&#xff…

centos7固定ip

1.查看虚拟网络配置 2.修改网卡配置文件 [jiajinglocalhost ~]$ su - Password: Last login: Thu Jul 4 19:06:16 PDT 2024 on pts/0 [rootlocalhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ON…

倘若你的的B端系统如此漂亮,还担心拿不出手吗,尤其是面对客户

如果你的B端系统设计如此漂亮&#xff0c;那么通常来说&#xff0c;你不太需要担心在客户那里拿不出手。一个漂亮和易用的设计可以提升用户体验&#xff0c;增加客户对系统的满意度。 然而&#xff0c;还是有一些因素需要考虑&#xff0c;以确保你的B端系统在客户那里能够得到良…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

【夏季跨境】7-9月热门类目选品指南(附自用选品工具免费插件)

一、夏季跨境热门类目及品类 1 、运动与户外 随着夏季的到来&#xff0c;户外活动变得更加频繁&#xff0c;运动和户外装备的需求显著上升 自行车配件 自行车部件&#xff1a;踏板、自行车配件存储、自行车灯、自行车手机支架 整车及相关配件&#xff1a;成人/儿童自行车、…

JavaEE——计算机工作原理

冯诺依曼体系&#xff08;VonNeumannArchitecture&#xff09; 现代计算机&#xff0c;大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算与逻辑判断 存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制存储&#xff09; 输入…

【python】OpenCV—Nighttime Low Illumination Image Enhancement

文章目录 1 背景介绍2 代码实现3 原理分析4 效果展示5 附录np.ndindexnumpy.ravelnumpy.argsortcv2.detailEnhancecv2.edgePreservingFilter 1 背景介绍 学习参考来自&#xff1a;OpenCV基础&#xff08;24&#xff09;改善夜间图像的照明 源码&#xff1a; 链接&#xff1a…

Golang 数组+切片+映射

数组 什么是数组 数组是一种数据类型&#xff0c;属于值类型数组可以存放多个同一类型数据 数组定义 var 数组名 [数组大小]数据类型 var a [5]int数组初始化的4种方式 var numArray01 [3]int [3]int{1,2,3} var numArray02 [3]int{1,2,3} var numArray03 [...]int{1,2…

直接更新flowable数据库的流程定义信息的一种方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

servlet学校会场预约系统-计算机毕业设计源码72972

摘要 学校会场预约是学校管理中的重要环节&#xff0c;但传统的手工预约方式存在效率低下和信息不准确等问题。为了提高预约效率和减少管理成本&#xff0c;许多学校开始采用基于Servlet技术的会场预约系统。本论文旨在设计和实现一种高效的Servlet学校会场预约系统&#xff0c…