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

news/2024/7/8 7:39:38 标签: python, 开发语言, 前端, flask, django, html
htmledit_views">

系列目录

上一篇:白骑士的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应用示例:

html" title=python>python">from html" title=flask>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与视图函数绑定,例如:

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

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

模板渲染

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

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

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

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

html" title=python>python">from html" title=flask>flask import render_template


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

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

表单处理与请求数据

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

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

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>

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

html" title=python>python">from html" title=flask>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 html" title=django>django

创建Django项目

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

html" title=django>django-admin startproject mysite

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

cd mysite
html" title=python>python manage.py runserver

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

创建Django应用

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

html" title=python>python manage.py startapp myapp

定义模型

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

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

html" title=python>python">from html" title=django>django.db import models


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

    def __str__(self):
        return self.name

迁移数据库

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

html" title=python>python manage.py makemigrations

        然后,应用迁移:

html" title=python>python manage.py migrate

定义视图与URL

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

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

html" title=python>python">from html" title=django>django.http import HttpResponse


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

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

html" title=python>python">from html" title=django>django.urls import path
from . import views


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

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

html" title=python>python">from html" title=django>django.contrib import admin
from html" title=django>django.urls import include, path


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

模板渲染

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

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

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

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

html" title=python>python">from html" title=django>django.shortcuts import render


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

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

表单处理

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

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

html" title=python>python">from html" title=django>django import forms


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

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

html" title=python>python">from html" title=django>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’:

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开发中,前后端交互是实现动态功能和提升用户体验的关键。html" title=前端>前端主要负责呈现用户界面,而后端负责处理数据和业务逻辑。通过API,前后端可以进行数据交换和交互。

RESTful API

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

html" title=python>python">from html" title=flask>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与html" title=前端>前端框架

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

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

        HTML文件:

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进行交互,动态加载和添加数据。

使用html" title=前端>前端框架

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

        HTML文件:

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和现代html" title=前端>前端框架,我们可以构建出具有优秀用户体验的Web应用。希望本文能够帮助你在Web开发的道路上迈出坚实的一步。

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


http://www.niftyadmin.cn/n/5536868.html

相关文章

PX2平台Pytorch源码编译

写在前面&#xff1a;以下内容完成于2019年底&#xff0c;只是把笔记放到了CSDN上。 需要注释掉NCLL及分布式相关的配置 libcudart.patch diff --git a/torch/cuda/__init__.py b/torch/cuda/__init__.py index 4591702..07e1268 100644 --- a/torch/cuda/__init__.pyb/torc…

C++: Map数组的遍历

在C中&#xff0c;map是一个关联容器&#xff0c;它存储的元素是键值对&#xff08;key-value pairs&#xff09;&#xff0c;其中每个键都是唯一的&#xff0c;并且自动根据键来排序。遍历map的方式有几种&#xff0c;但最常用的两种是使用迭代器&#xff08;iterator&#xf…

密码学原理精解【5】

这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256​)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密&#xff1a; e k ( x ) ( x k ) m o d 26 解密&#xff1a; d k ( x ) ( x − k ) m o d 26 以z_{…

C#Winform窗体中嵌入exe文件

1&#xff0c;效果以嵌入Modbus Slave为例&#xff1a; 2&#xff0c;代码&#xff1a; public partial class Form1 : Form{//设置嵌入exe的常量private const int nIndex -16;private const int dwNewLong 0x10000000;Process m_AppProcess;public Form1(){InitializeCompo…

c进阶篇(四):内存函数

内存函数以字节为单位更改 1.memcpy memcpy 是 C/C 中的一个标准库函数&#xff0c;用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中&#xff0c;其作用是将一块内存中的数据复制到另一块内存中。 函数原型&#xff1a;void *memcpy(void *dest, const void…

ffmpeg使用mjpeg把yuvj420p编码为jpg图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 1. 通过*.jpg推测时&#xff0c;out_fmt为image2&#xff0c;打开*.jpg文件时&#xff0c;in_fmt为image2 但是out_fmt为image2时&…

中英双语介绍美国的州:阿肯色州(Arkansas)

中文版 阿肯色州简介 阿肯色州&#xff08;Arkansas&#xff09;位于美国南部&#xff0c;以其多样的自然景观、丰富的文化遗产和不断发展的经济而闻名。以下是对阿肯色州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 阿肯色州东临…

【经验总结】Springboot打印指定类的日志到指定文件中

原文地址&#xff1a;https://www.cnblogs.com/zeng1994/p/f9bff238b13a0bf8fb8bf88c41db7a34.html 以下内容已经过实践&#xff0c;勘误&#xff0c;总结 环境&#xff1a;Springboot2.5.2 公司有个项目&#xff0c;需要和几个第三方系统对接。这种项目&#xff0c;日志一定要…