Python入门(15)--Web开发

news2024/11/25 23:24:16

Web开发入门教程 🌐

1. Flask框架入门 🚀

1.1 Flask基础介绍

Flask是一个轻量级的Python Web框架,提供了快速开发Web应用的工具和库:

from flask import Flask, request, jsonify, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

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

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

1.2 路由与视图函数

# URL参数处理
@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

# HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return handle_login()
    return show_login_form()

# 请求处理
@app.route('/api/data')
def get_data():
    data = request.args.get('type')
    return jsonify({'data': data})

1.3 模板渲染

# 使用Jinja2模板
@app.route('/dashboard')
def dashboard():
    user = {'name': 'John', 'role': 'Admin'}
    posts = get_user_posts()
    return render_template('dashboard.html',
                         user=user,
                         posts=posts)
<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Dashboard</title>
</head>
<body>
    <h1>Welcome {{ user.name }}</h1>
    {% for post in posts %}
        <div class="post">
            <h2>{{ post.title }}</h2>
            <p>{{ post.content }}</p>
        </div>
    {% endfor %}
</body>
</html>

2. RESTful API设计 📡

2.1 API设计原则

  1. 使用HTTP方法表示操作:

    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • DELETE:删除资源
  2. 使用合适的状态码:

    • 200:成功
    • 201:创建成功
    • 400:客户端错误
    • 404:资源不存在
    • 500:服务器错误

2.2 API实现示例

from flask import Flask, request, jsonify
from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)

# 文章资源
class ArticleAPI(Resource):
    def get(self, article_id=None):
        if article_id:
            return get_article(article_id)
        return get_all_articles()
    
    def post(self):
        data = request.get_json()
        return create_article(data), 201
    
    def put(self, article_id):
        data = request.get_json()
        return update_article(article_id, data)
    
    def delete(self, article_id):
        return delete_article(article_id)

# 注册API路由
api.add_resource(ArticleAPI, '/api/articles', '/api/articles/<int:article_id>')

2.3 错误处理

from werkzeug.exceptions import HTTPException

@app.errorhandler(HTTPException)
def handle_exception(e):
    response = {
        "code": e.code,
        "name": e.name,
        "description": e.description,
    }
    return jsonify(response), e.code

class APIError(Exception):
    def __init__(self, message, status_code=400):
        self.message = message
        self.status_code = status_code

@app.errorhandler(APIError)
def handle_api_error(error):
    response = {
        'error': error.message
    }
    return jsonify(response), error.status_code

3. 数据库操作 💾

3.1 SQLAlchemy配置

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
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)
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

3.2 数据库操作

# 创建
def create_user(username, email):
    user = User(username=username, email=email)
    db.session.add(user)
    db.session.commit()
    return user

# 查询
def get_user(user_id):
    return User.query.get_or_404(user_id)

# 更新
def update_user(user_id, data):
    user = User.query.get_or_404(user_id)
    for key, value in data.items():
        setattr(user, key, value)
    db.session.commit()
    return user

# 删除
def delete_user(user_id):
    user = User.query.get_or_404(user_id)
    db.session.delete(user)
    db.session.commit()

4. 实战案例:个人博客系统 📝

让我们创建一个完整的个人博客系统:

from flask import Flask, request, jsonify, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user
from werkzeug.security import generate_password_hash, check_password_hash

class BlogSystem:
    def __init__(self):
        self.app = Flask(__name__)
        self.init_app()
        
    def init_app(self):
        """初始化应用"""
        self.app.config['SECRET_KEY'] = 'your-secret-key'
        self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
        
        self.db = SQLAlchemy(self.app)
        self.login_manager = LoginManager()
        self.login_manager.init_app(self.app)
        
        self.create_models()
        self.register_routes()
        
    def create_models(self):
        """定义数据模型"""
        class User(UserMixin, self.db.Model):
            id = self.db.Column(self.db.Integer, primary_key=True)
            username = self.db.Column(self.db.String(80), unique=True)
            password_hash = self.db.Column(self.db.String(120))
            posts = self.db.relationship('Post', backref='author', lazy=True)
            
        class Post(self.db.Model):
            id = self.db.Column(self.db.Integer, primary_key=True)
            title = self.db.Column(self.db.String(100))
            content = self.db.Column(self.db.Text)
            created_at = self.db.Column(self.db.DateTime, 
                                      default=datetime.utcnow)
            user_id = self.db.Column(self.db.Integer, 
                                   self.db.ForeignKey('user.id'))
            
        self.User = User
        self.Post = Post
        
    def register_routes(self):
        """注册路由"""
        @self.app.route('/')
        def home():
            posts = self.Post.query.order_by(
                self.Post.created_at.desc()).all()
            return render_template('home.html', posts=posts)
        
        @self.app.route('/post/<int:post_id>')
        def view_post(post_id):
            post = self.Post.query.get_or_404(post_id)
            return render_template('post.html', post=post)
        
        @self.app.route('/create', methods=['GET', 'POST'])
        def create_post():
            if request.method == 'POST':
                title = request.form['title']
                content = request.form['content']
                post = self.Post(title=title, content=content)
                self.db.session.add(post)
                self.db.session.commit()
                return redirect(url_for('view_post', post_id=post.id))
            return render_template('create_post.html')

def main():
    """主函数:启动博客系统"""
    blog = BlogSystem()
    blog.app.run(debug=True)

if __name__ == '__main__':
    main()

博客系统特点:

  1. 完整的用户系统

    • 用户注册和登录
    • 密码加密存储
    • 用户认证和授权
  2. 文章管理功能

    • 创建和编辑文章
    • 文章分类和标签
    • 评论系统
  3. 前端展示

    • 响应式设计
    • 文章列表和详情页
    • 用户个人中心
  4. 扩展功能

    • 搜索功能
    • RSS订阅
    • 文章统计

扩展建议:

  1. 添加文章分类系统
  2. 实现评论功能
  3. 添加用户权限管理
  4. 实现文章搜索
  5. 添加文件上传功能
  6. 实现API接口
  7. 添加缓存系统

这个实战案例展示了如何使用Flask框架构建一个完整的博客系统,涵盖了Web开发中的各个重要概念和技术点。你可以基于这个框架继续扩展更多功能。


如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇

咱们下一期见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年11月最新 Alfred 5 Powerpack (MACOS)下载

在现代数字化办公中&#xff0c;我们常常被繁杂的任务所包围&#xff0c;而时间的高效利用成为一项核心需求。Alfred 5 Powerpack 是一款专为 macOS 用户打造的高效工作流工具&#xff0c;以其强大的定制化功能和流畅的用户体验&#xff0c;成为众多效率爱好者的首选。 点击链…

C#里怎么样检测文件的属性?

C#里怎么样检测文件的属性? 对于文件来说,在C#里有一种快速的方法来检查文件的属性。 比如文件是否已经压缩, 文件是否加密, 文件是否是目录等等。 属性有下面这么多: 例子演示如下: /** C# Program to View the Information of the File*/ using System; using Syste…

网络安全,文明上网(4)掌握网络安全技术

前言 在数字化时代&#xff0c;个人信息和企业数据的安全变得尤为重要。为了有效保护这些宝贵资产&#xff0c;掌握一系列网络安全技术是关键。 核心技术及实施方式 1. 网络监控与过滤系统&#xff1a; 这些系统构成了网络防御体系的基石&#xff0c;它们负责监控网络通信&…

Vue 项目中如何使用FullCalendar 时间段选择插件(类似会议室预定、课程表)

本文中是基于VUEelementui项目中实现的前后端分离的前端功能部分&#xff1a; 插件的官方文档&#xff1a;FullCalendar 1.安装对应依赖&#xff08;统一安装版本为6.15&#xff09; npm install --save fullcalendar/core6.15 npm install --save fullcalendar/daygrid6.…

Oracle SQL优化③——表的连接方式

前言 表&#xff08;结果集&#xff09;与表&#xff08;结果集&#xff09;之间的连接方式非常重要&#xff0c;如果CBO选择了错误的连接方式&#xff0c;本来几秒就能出结果的SQL可能执行一天都执行不完。如果想要快速定位超大型SQL性能问题&#xff0c;就必须深入理解表连接…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…

Java基于SpringBoot+Vue的藏区特产销售平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案

本文旨在深入探讨xinput1_3.dll这一动态链接库文件。首先介绍其在计算机系统中的功能和作用&#xff0c;特别是在游戏和输入设备交互方面的重要性。然后分析在使用过程中可能出现的诸如文件丢失、版本不兼容等问题&#xff0c;并提出相应的解决方案&#xff0c;包括重新安装相关…

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…

IEC61850读服务器目录命令——GetServerDirectory介绍

IEC61850标准中的GetServerDirectory命令是变电站自动化系统中非常重要的一个功能&#xff0c;它主要用于读取服务器的目录信息&#xff0c;特别是服务器的逻辑设备节点&#xff08;LDevice&#xff09;信息。以下是对GetServerDirectory命令的详细介绍。 目录 一、命令功能 …

基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)

1 项目背景 需要在图片精确识别三跟红线所在的位置&#xff0c;并输出这三个像素的位置。 其中&#xff0c;每跟红线占据不止一个像素&#xff0c;并且像素颜色也并不是饱和度和亮度极高的红黑配色&#xff0c;每个红线放大后可能是这样的。 而我们的目标是精确输出每个红点的…

前端:JavaScript (学习笔记)【2】

目录 一&#xff0c;数组的使用 1&#xff0c;数组的创建 [ ] 2&#xff0c;数组的元素和长度 3&#xff0c;数组的遍历方式 4&#xff0c;数组的常用方法 二&#xff0c;JavaScript中的对象 1&#xff0c;常用对象 &#xff08;1&#xff09;String和java中的Stri…

全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决

当你满心期待地打开某个常用软件&#xff0c;却突然弹出一个错误框&#xff0c;提示“mfc140u.dll丢失”&#xff0c;那一刻&#xff0c;你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族&#xff0c;面对这个问题都可能不知所…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 &#xff08;1&#xff09;内部SRAM &#xff08;2&#xff09;内部闪存存储器 &#xff08;3&#xff09;AHB到APB的桥&#xff08;AHB to APBx&#xff09; 2、四个主动&#xff08;驱动&#xff09;单元 &#x…

【PHP】 环境以及插件的配置,自学笔记(一)

文章目录 环境的准备安装 XAMPPWindowMacOS 配置开发环境Vscode 关于 PHP 的插件推荐Vscode 配置 php 环境Apache 启动Hello php配置热更新 参考 环境的准备 下载 XAMPP , 可以从 官网下载 https://www.apachefriends.org/download.html 安装 XAMPP XAMPP 是一个跨平台的集成开…

跟着问题学5——深度学习中的数据集详解(1)

深度学习数据集的创建与读取 数据 &#xff08;计算机术语&#xff09; 数据(data)是事实或观察的结果&#xff0c;是对客观事物的逻辑归纳&#xff0c;是用于表示客观事物的未经加工的的原始素材。 数据可以是连续的值&#xff0c;比如声音、图像&#xff0c;称为模拟数据。…

实验-Linux文件系统和磁盘管理

操作1 远程连接Linux系统 下述连接方式2选一即可。 使用xshell工具连接Linux系统。打开xshell&#xff0c;新建连接&#xff0c;将主机ip修改为实际Linux系统的ip(ifconfig命令查看)&#xff0c;可以新建多个xshell会话&#xff0c;使用不同的用户名登录&#xff0c;方便后续…

GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性

产品描述 GPTZero 是一款先进的AI文本检测工具&#xff0c;专为识别由大型语言模型&#xff08;如ChatGPT、GPT-4、Bard等&#xff09;生成的文本而设计。它通过分析文本的复杂性和一致性&#xff0c;判断文本是否可能由人类编写。GPTZero 已经得到了超过100家媒体机构的报道&…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…