学会了这几点,你就学会了Web | Django 与数据库交互

基于Django的多媒体管理系统设计与实现 多媒体管理系统是现代Web开发中的常见需求,它涉及文件存储、检索和权限管理等核心技术。Django作为Python的主流Web框架,凭借其ORM系统、Admin后台和丰富的第三方库支持,能够高效实现这类系统。本文以毕业设计项目为例,详细介绍了如何利用Django开发多媒体资料管理系统,包括文件上传与管理、预览播放、搜索功能和权限控制等核心模块的实现。系统采用MVC架构,前端使用Bootstrap+jQuery,后端基于Django REST Framework提供API接口。对于需要处理海量多媒体文件的教育 阅读详情

对开发人员来说,Django的ORM 确实非常实用,但是将数据库的访问抽象出来本身是有成本的,那些愿意在数据库中探索的开发人员,经常会发现修改ORM 的默认行为可以带来性能的提升。在本文中,我将分享在 Django 中使用数据库的 9 个技巧。

1. 过滤器聚合(Aggregation with Filter)

在 Django 2.0之前,如果我们想要得到诸如用户总数和活跃用户总数之类的东西,我们不得不求助于条件表达式:

from django.contrib.auth.models import User
from django.db.models import (
    Count,
    Sum,
    Case,
    When,
    Value,
    IntegerField,
)

User.objects.aggregate(
    total_users=Count('id'),
    total_active_users=Sum(Case(
        When(is_active=True, then=Value(1)),
        default=Value(0),
        output_field=IntegerField(),
    )),
)

在Django 2.0中,添加了聚合函数的过滤器参数,使其更容易:

from django.contrib.auth.models import User
from django.db.models import Count, F

User.objects.aggregate(
    total_users=Count('id'),
    total_active_users=Count('id', filter=F('is_active')),
)

很棒,又短又可口。如果你正在使用 ostgreSQL,这两个查询将如下所示:

SELECT
    COUNT(id) AS total_users,
    SUM(CASE WHEN is_active THEN 1 ELSE 0 END) AS total_active_users
FROM
    auth_users;
SELECT
    COUNT(id) AS total_users,
    COUNT(id) FILTER (WHERE is_active) AS total_active_users
FROM
    auth_users;

第二个查询使用了WHERE 过滤子句。

码字不易废话两句:有需要python学习资料的或者有技术问题交流 “点击”即可

2. 查询集的结果变为具名元组(QuerySet results as namedtuples)

我是一个 namedtuples 的粉丝,同时也是Django 2.0的 ORM 的粉丝。
在Django 2.0 中,values_list方法的参数中添加了一个叫做 named的属性。将 named设置为 True 会将 QuerySet 作为 namedtuples 列表返回:

> user.objects.values_list(
    'first_name',
    'last_name',
)[0]
(‘Haki’, ‘Benita’)
> user_names = User.objects.values_list(
    'first_name',
    'last_name',
    named=True,
)
> user_names[0]
Row(first_name='Haki', last_name='Benita')
> user_names[0].first_name
'Haki'
> user_names[0].last_name
'Benita'

3. 自定义函数(Custom functions)

Django 2.0的 ORM功能非常强大,而且特性丰富,但还是不能与所有数据库的特性同步。不过幸运的是,ORM让我们用自定义函数来扩展它。
假设我们有一个记录报告的持续时间字段,我们希望找到所有报告的平均持续时间:

from django.db.models import Avg
Report.objects.aggregate(avg_duration=Avg(‘duration’))
> {'avg_duration': datetime.timedelta(0, 0, 55432)}

那很棒,但是如果只有均值,信息量有点少。我们再算出标准偏差吧:

from django.db.models import Avg, StdDev
Report.objects.aggregate(
    avg_duration=Avg('duration'),
    std_duration=StdDev('duration'),
)
ProgrammingError: function stddev_pop(interval) does not exist
LINE 1: SELECT STDDEV_POP("report"."duration") AS "std_dura...
               ^
HINT:  No function matches the given name and argument types.
You might need to add explicit type casts.

PostgreSQL 不支持间隔类型字段的求标准偏差操作,我们需要将时间间隔转换为数字,然后才能对它应用 STDDEV_POP 操作。

一个选择是从时间间隔中提取:

SELECT
    AVG(duration),
    STDDEV_POP(EXTRACT(EPOCH FROM duration))
FROM 
    report;

      avg       |    stddev_pop
----------------+------------------
 00:00:00.55432 | 1.06310113695549
(1 row)

那么我们如何在 Django 中实现呢?你猜到了 – 一个自定义函数:

# common/db.py
from django.db.models import Func

class Epoch(Func):
   function = 'EXTRACT'
   template = "%(function)s('epoch' from %(expressions)s)"

我们的新函数这样使用:

from django.db.models import Avg, StdDev, F
from common.db import Epoch

Report.objects.aggregate(
    avg_duration=Avg('duration'),
    std_duration=StdDev(Epoch(F('duration'))),
)
{'avg_duration': datetime.timedelta(0, 0, 55432),
 'std_duration': 1.06310113695549}

*注意在 Epoch 调用中使用 F 表达式。

4. 声明超时(Statement Timeout)

这可能是我给的最简单的也是最重要的提示。我们是人类,我们都会犯错。我们不可能考虑到每一个边缘情况,所以我们必须设定边界。

与其他非阻塞应用程序服务器(如Tornado,asyncio 甚至 Node)不同,Django 通常使用同步工作进程。这意味着,当用户执行长时间运行的操作时,工作进程会被阻塞,完成之前,其他人无法使用它。

应该没有人真正在生产中只用一个工作进程来运行 Django,但是我们仍然希望确保一个查询不会浪费太多资源太久。

在大多数Django 应用程序中,大部分时间都花在等待数据库查询上了。所以,在 SQL 查询上设置超时是一个很好的开始。

我喜欢像这样在我的 wsgi.py文件中设置一个全局超时:

# wsgi.py
from django.db.backends.signals import connection_created
from django.dispatch import receiver

@receiver(connection_created)
def setup_postgres(connection, **kwargs):
    if connection.vendor != 'postgresql':
        return
    
    # Timeout statements after 30 seconds.
    with connection.cursor() as cursor:
        cursor.execute("""
            SET statement_timeout TO 30000;
        """)

为什么是wsgi.py? 因为这样它只会影响工作进程,不会影响进程外的分析查询,cron任务等。

希望您使用的是持久的数据库连接,这样每次请求都不会再有连接开销。超时也可以配置到用户粒度:

postgresql=#> alter user app_user set statement_timeout TO 30000;
ALTER ROLE

题外话:我们花了很多时间在其他常见的地方,比如网络。因此,请确保在调用远程服务时始终设置超时时间:

import requests

response = requests.get(
    'https://api.slow-as-hell.com',
    timeout=3000,
)

5.限制(Limit)

这与设置边界的最后一点有些相关。有时我们的客户的一些行为是不可预知的。比如,同一用户打开另一个选项卡并在第一次尝试「卡住」时再试一次并不罕见。

这就是为什么需要使用限制(Limit)。

我们限制某一个查询的返回不超过 100 行数据:

# bad example
data = list(Sale.objects.all())[:100]

这很糟糕,因为虽然只返回 100 行数据,但是其实你已经把所有的行都取出来放进了内存。

我们再试试:

data = Sale.objects.all()[:100]

这个好多了,Django 会在 SQL 中使用limit 子句来获取 100 行数据。

我们增加了限制,但我们仍然有一个问题 – 用户想要所有的数据,但我们只给了他们 100 个,用户现在认为只有 100 个数据了。

并非盲目的返回前 100 行,我们先确认一下,如果超过 100 行(通常是过滤以后),我们会抛出一个异常:

LIMIT = 100

if Sales.objects.count() > LIMIT:
    raise ExceededLimit(LIMIT)
return Sale.objects.all()[:LIMIT]

挺有用,但是我们增加了一个新的查询。

能不能做的更好呢?我们可以这样:

LIMIT = 100

data = Sale.objects.all()[:(LIMIT + 1)]
if len(data) > LIMIT:
    raise ExceededLimit(LIMIT)
return data

我们不取 100 行,我们取100 + 1 = 101 行,如果 101 行存在,那么我们知道超过了 100 行:

记住LIMIT + 1窍门,有时候它会非常方便。

6. 事务与锁的控制

这个比较难。由于数据库中的锁机制,我们开始在半夜发现事务超时错误。在我们的代码中操作事务的常见模式如下所示:

from django.db import transaction as db_transaction

...
with db_transaction.atomic():
  transaction = (
        Transaction.objects
        .select_related(
            'user',
            'product',
            'product__category',
        )
        .select_for_update()
        .get(uid=uid)
  )
  ...

事务操作通常会涉及用户和产品的一些属性,所以我们经常使用select_related来强制 join 并保存一些查询。

更新交易还会涉及获得一个锁来确保它不被别人获得。

现在,你看到问题了吗?没有?我也没有。

我们有一些晚上运行的 ETL 进程,主要是在产品和用户表上做维护。这些 ETL 操作会更新字段然后插入表,这样它们也会获得了表的锁。

那么问题是什么?当 select_for_update 与 select_related一起使用时,Django 将尝试获取查询中所有表的锁。

我们用来获取事务的代码尝试获取事务表、用户、产品、类别表的锁。一旦 ETL 在午夜锁定了后三个表,交易就开始失败。

一旦我们对问题有了更好的理解,我们就开始寻找只锁定必要表(事务表)的方法。(又)幸运的是,select_for_update 的一个新选项在 Django 2.0中可用:

from django.db import transaction as db_transaction

...
with db_transaction.atomic():
  transaction = (
        Transaction.objects
        .select_related(
            'user',
            'product',
            'product__category',
        )
        .select_for_update(
            of=('self',)
        )
        .get(uid=uid)
  )
  ...

这个 of选项被添加到select_for_update ,使用 of 可以指明我们要锁定的表,self是一个特殊的关键字,表示我们要锁定我们正在处理的模型,即事务表。

目前,该功能仅适用于PostgreSQL 和 Oracle。

7. 外键索引(FK Indexes)

创建模型时,Django会在所有外键上创建一个B-Tree 索引,它的开销可能相当大,而且有时候并不很必要。

典型的例子是 M2M(多对多)关系的直通模型:

class Membership(Model):
    group = ForeignKey(Group)
    user = ForeignKey(User)

在上面的模型中,Django 将会隐式的创建两个索引:一个用于用户,一个用于组。
M2M模型中的另一个常见模式是在两个字段一起作为一个唯一约束。在这种情况下,意味着一个用户只能是同一个组的成员,还是那个模型:

class Membership(Model):
    group = ForeignKey(Group)
    user = ForeignKey(User)
    class Meta:
        unique_together = (
           'group',
           'user',
        )

这个unique_together 也会创建两个索引,所以我们得到了两个字段三个索引的模型 ?
根据我们用这个模型的职能,我们可以设置db_index=False忽略FK 索引,只保留唯一约束索引:

class Membership(Model):
    group = ForeignKey(Group, db_index=False)
    user = ForeignKey(User, db_index=False)
    class Meta:
        unique_together = (
            'group',
            'user',
        )

删除冗余的索引将会是插入和查询更快,而且我们的数据库更轻量。

8. 组合索引中列的顺序(Order of columns in composite index)

具有多个列的索引称为组合索引。在 B-Tree 组合索引中,第一列使用树结构进行索引。从第一层的树叶为第二层创建一棵新树,以此类推。

索引中列的顺序非常重要。

在上面的例子中,我们首先会得到一个组(group)的树,另一个树是所有它的用户(user)。B-Tree 组合索引的经验法则是使二级索引尽可能小。换句话说,高基数(更明确的值)的列应该是在第一位的。

在我们的例子中,假设组少于用户(一般),所以把用户列放在第一位会使组的二级索引变小。

class Membership(Model):
    group = ForeignKey(Group, db_index=False)
    user = ForeignKey(User, db_index=False)
    class Meta:
        unique_together = (
            'user',
            'group',
        )

注意unique_together元组里面的’user‘和’group'顺序调整了,使索引更小。
这只是一个经验法则,最终的索引应该针对特定的场景进行优化。这里的要点是要知道隐式索引和组合索引中列顺序的重要性。

9. 块范围索引(BRIN indexes)

B-Tree 索引的结构像一棵树。查找单个值的成本是随机访问表的树的高度+ 1。这使得 B-Tree 索引非常适合独特的约束和(一些)范围查询。

B-Tree索引的缺点是它的大小 – B-Tree索引可能会变大。

没有其他选择了吗?并不是,数据库为特定用例提供其他类型的索引也蛮多的。
从 Django 1.11 开始,有一个新的Meta 选项用于在模型上创建索引。这给了我们探索其他类型索引的机会。

PostgreSQL 有一个非常有用的索引类型 BRIN(块范围索引)。在某些情况下,BRIN索引可以比 B-Tree 索引更高效。

我们看看官网文档怎么说的:

BRIN 设计用于处理非常大的表格,其中某些列与表格内的物理位置有一些自然的相关性。
要理解这个陈述,了解 BRIN索引如何工作是很重要的。顾名思义,BRIN索引会在表格中的一系列相邻块上创建一个小型索引。该索引非常小,只能说明某个值是否在范围内,或者是否在索引块范围内。

我们来做一个 BRIN 索引如何帮助我们的简单例子。

假设我们在一列中有这些值,每一个都是一个块:

1, 2, 3, 4, 5, 6, 7, 8, 9

我们为每三个相邻的块创建一个范围

[1,2,3], [4,5,6], [7,8,9]

对于每个范围,我们将保存范围内的最小值和最大值:

[1–3], [4–6], [7–9]

我们尝试通过此索引搜索 5:

[1–3] —  绝对没在这里

[4–6] — 可能在这里

[7–9] — 绝对没在这里

使用索引,我们限制了我们搜索的范围在 [4-6] 范围。

再举一个例子,这次列中的值不会被很好地排序:

[2–9], [1–7], [3–8]

再试着查找 5:

[2–9] — 可能在这里

[1–7] — 可能在这里

[3–8] — 可能在这里

索引是无用的 – 它不仅没有限制搜索,实际上我们不得不搜索更多,因为我们同时提取了索引和整个表。

回到文档:

列与表格内的物理位置有一些自然的相关性

这是 BRIN索引的关键。为了充分利用它,列中的值必须大致排序或聚集在磁盘上。

现在回到 Django,我们有哪些常被索引的字段,最有可能在磁盘上自然排序?没错,就是 auto_now_add。(这个很常用,没用到的小伙伴可以了解下)

Django模型中一个非常常见的模式是:

class SomeModel(Model):
    created = DatetimeField(
        auto_now_add=True,
    )

当使用 auto_now_add 时,Django 将自动使用当前时间填充该行的时间。创建的字段通常也是查询的绝佳候选字段,所以它通常被插入索引。

让我们在创建时添加一个BRIN索引:

from django.contrib.postgres.indexes import BrinIndex
class SomeModel(Model):
    created = DatetimeField(
        auto_now_add=True,
    )
    class Meta:
        indexes = (
            BrinIndex(fields=['created']),
        )

为了了解大小的差异,我创建了一个约 2M 行的表,并在磁盘上自然排序了日期字段:

B-Tree 索引:37 MB

BRIN 索引:49 KB

没错,你没看错。

创建索引时要考虑的要比索引的大小要多得多。但是现在,通过 Django 1.11 支持索引,我们可以轻松地将新类型的索引整合到我们的应用程序中,使它们更轻,更快。

以上就是小编今天为大家带来的内容,小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴 " 点击 " 即可领取

Django入门:理清MVT与请求生命周期,从零搭建留言板 Web开发中,后端框架的选择直接影响开发效率与项目结构。Django作为Python生态中最成熟的全栈框架之一,凭借“约定大于配置”的设计理念,将URL路由、视图处理、对象关系映射和模板渲染整合为一条清晰的技术链路。初学者常被繁杂的配置项干扰,难以抓住核心主线。理解MVC与MVT架构的差异,掌握请求从浏览器到服务器再返回响应的完整生命周期,是打通Django开发的关键。ORM让开发者以Python对象方式操作数据库,模板系统则将数据动态渲染为HTML页面,而URL路由负责将用户请求精准分发给对应的视图函数。 阅读详情

相关推荐

构建Web API与Django项目的实战指南

本文以构建图书馆网站和Web API为案例,详细介绍了使用Django REST Framework和传统Django开发Web应用的过程。我们了解了Django和Django REST Framework的区别,以及如何设置开发环境和项目结构。文章还提供了创建项目、应用和数据库模型的实践步骤,以及如何通过Django的管理命令来运行和测试我们的网站。

weixin_42300144的博客 637

No operator matches the given name and argument types. You might need to add explicit type casts

No operator matches the given name and argument types. You might need to add explicit type casts

qq_33745371的博客 2万+

基于Django与UFLD的车道线检测系统:从AI模型到Web服务的全栈实践

深度学习模型训练完成后,如何将其转化为可交互的在线服务是AI工程化落地的关键一步。其核心原理在于将训练好的模型权重文件封装成独立的推理模块,并通过Web框架提供标准化的API接口,实现用户请求的接收、模型调用与结果返回。这一过程的技术价值在于打通了从算法到产品的闭环,使得前沿的AI能力能够以低门槛、高可用的方式服务于实际应用。在自动驾驶、智能安防、工业质检等场景中,这种AI模型服务化架构是支撑产品迭代和用户体验的基础。本文以车道线检测这一经典计算机视觉任务为例,详细阐述了如何利用Django框架和Ultra

weixin_34357436的博客 331

postgresql 设置执行命令超时时间

通过设置statement_timeout参数设置命令最大执行时间,单位为毫秒,超过时间将取消执行. 1. 配置文件 设置 .在postgresql.conf中配置statement_timeout参数(单位为毫秒),会影响所有会话,不建议使用. 2.在当前会话中设置 仅对当前会话生效(单位为毫秒) set statement_timeout to 30000; 3.Npgsql通过连...

kmblack1的专栏 2万+

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

Zephyr RTOS -- 学习笔记总述

文章目录摘要1. 开发基础部分2. 内核服务入门 本笔记基于 Zephyr 版本 2.6.0-rc2 摘要 1. 开发基础部分 2. 内核服务入门 2.1 线程简介 2.2 线程 2.3 工作队列线程 2.4 调度 2.5 中断 2.6 轮询 API 2.7 信号量

思想给了我们太多的自由,而我们拖累了思想...... 4824

No operator matches the given name and argument types. You might need to add explicit type casts.

习惯使用Oracle或者MySQL数据的人,刚用pgsql时容易犯字段类型异常,它与Oracle、MySQL不一样。对字段类型比较关注。 根据错误提示提示,结合sql分析,因为我在?传的是一个字符串类型,而<左边是一个double类型的字段,错误报错double字段无法与字符串类型作比较。 我的解决方法时将<右边换成double类型的。 用 cast(需要的字段 as 类型) 或者 需要的字段 :: 类型 where date_part('epoch', '2022-05-22 12:..

一步一步的前进 5272

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2905

postgresql uuid模糊搜索 uuid string 类型转换 SQL Error [42883] explicit type casts

要对 postgresql 中某张表进行过滤,过滤字段为,uuid不好手动输入啊,如果能对 uuid 类型的列进行模糊匹配就好了。 SQL Error [42883] 形如的写法,可以对变量/列/值进行类型转换。即为 明确的类型转换。 以上SQL会查出3列1行的结果集。问题是:每列的数据类型分别是什么?字符串 UUID 字符串你想不想知道像这样 的写法,还有哪些类型名称可以写? 见 https://www.postgresql.org/docs/current/datatype.html DBeave

wuyujin1997的博客 3155

Verilog流水线CPU设计(超详细)

快把这一篇给更了

Ace Cheney的博客 7万+

陀螺仪与加速度计的姿态融合——互补滤波

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

小白白学电子 2万+

时间格式转字符串出错(You might need to add explicit type casts)

java时间格式转换成hh:mm:ss出错 报错信息:You might need to add explicit type casts 原因是我把格式输入错了 正确的应该是 yyyy-MM-dd HH:mm:ss 一定需要注意大小写 ...

su1177的博客 7135

深度强化学习 | 详解基于价值的强化学习DQN算法(附Pytorch实现)

深度Q网络DQN的核心原理是通过经验回放池和目标网络技术拟合高维状态空间,是Q-Learning算法的深度学习版本,本文分析DQN的基本算法,并给出训练实例和实际案例

FRIGIDWINTER的博客 4985

为什么Django框架持续统治着Python开发世界,它做到了这几点……_为什么要用django 开发api

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习Django基于“Batteries-Included”的理念,可不必使用单独的库来实现常见功能,例如身份验证,URL路由,模板系统,对象关系映射器(ORM)和数据库模式迁移。

2401_84569514的博客 758

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 411

【Apache Paimon】-- 13 -- 利用 paimon-flink-action 同步 mysql 表数据

在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式(1)人工通知(比如常规的使用邮件),然后运维人员手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hive 的外部表和内部表 schema那么现在,有了 Paimon ,我们可以利用其特性,自动识别并同步 DDL 这些变化,并同步至 hive 的 paimon 格式表中。

欢迎来到我的博客,一起探索代码里的世界! 1248

为什么Django框架持续统治着Python开发世界,它做到了这几点……_为什么要用django 开发api(1)

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

2401_84538063的博客 704

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Django安装与测试全流程指南:从环境配置到跑通测试

在Python Web开发中,Django作为功能完整的框架广受青睐。其安装与测试的核心在于理解虚拟环境与依赖管理:通过venv隔离项目依赖,使用pip精准安装包,可避免系统环境冲突。遵循“创建项目-启动服务器-编写测试”的标准链路,能快速验证框架可用性。面向初学者与团队协作场景,系统梳理从环境准备、Django安装、项目创建到自动化测试的完整流程,并总结常见报错排查思路,帮助开发者搭建可复现的开发环境。

weixin_33957648的博客 448

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于Django的二手交易系统毕业设计:从架构设计到源码实现

Web开发的核心在于如何将业务逻辑、数据安全与用户体验高效结合,构建稳定可扩展的应用。Django作为Python的主流全栈框架,以其内置的ORM、Admin后台和认证系统,为快速实现MVC(MTV)架构提供了坚实基础。其技术价值在于通过“开箱即用”的组件和清晰的约定,让开发者能聚焦于复杂业务逻辑的实现,如用户状态管理、数据关联查询和事务处理。在电商、内容管理等典型应用场景中,这种模式能显著提升开发效率并保障代码质量。本文以二手物品交易系统为例,深入解析如何运用Django最佳实践处理商品状态流转、图片上传

weixin_33895516的博客 458

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Django】Django项目结构与单元测试

学校的软工项目要开发一个网站,自然的想到用python+Django来做。由于之前没有用Django开发过大型的网站项目,所以遇到了一些问题。记录在此,便于以后查阅。 今天完成了项目结构的设计、部分的单元测试以及把代码使用策略模式重构。 项目结构 使用app完成功能 首先要明确网站基本的功能实现是要用各种各样的app来实现的,我觉得这样的优点有几点: 功能划分明确,之后修改方便。 因为有...

沉潜 119

Django验证码实现:基于Pillow库的手动生成与安全集成指南

验证码是Web应用中用于区分人机操作的基础安全组件,其核心原理是通过生成包含随机字符的图片,利用人眼易识别而机器难解析的特性,来抵御自动化攻击。在技术实现上,图像处理库Pillow提供了强大的绘图能力,能够灵活控制验证码的样式、干扰元素和安全性。结合Django框架的Session机制,可以实现验证码文本的安全存储与一次性校验,为登录、注册等敏感操作提供可靠防护。这种手动实现方案不仅避免了第三方库的依赖,还让开发者深入理解验证码的生成逻辑、图像绘制流程以及与Web请求的集成方式,对于构建轻量、可控的安全验证

weixin_30765577的博客 536

Django入门核心主线:URL、视图、模型、模板四步打通

Web开发中,Django作为成熟的全栈框架,凭借内置ORM、模板引擎和强大的生态,成为构建业务系统的常用选择。理解其运作原理,关键在于把握HTTP请求从进入到响应的完整路径:浏览器请求URL后,Django通过路由分发调用对应视图,视图借助模型操作数据库,最终由模板渲染出HTML响应。这套机制不仅适用于博客、内容管理,也广泛用于后台管理系统、数据展示平台等场景。通过模型映射数据表、视图处理业务逻辑、模板动态展示内容,开发者无需直接编写SQL即可完成数据交互。对初学者而言,真正需要优先抓牢的正是URL配置、

449

对于Python如果你选择了自学,我想给你提几点建议 《文末有全套教程》

零基础学习Python。

Trb701012的博客 1027

python基于Python对b站热门视频的数据分析与研究

本文基于Django框架和Python语言开发了B站热门视频数据分析系统,采用Hadoop、Spark等技术构建大数据处理架构。系统通过Hive数据仓库实现数据分层存储(ODS、STD、DWD等),利用Spark进行高效计算,最终将处理结果可视化展示。研究重点包括:1)基于MTV模式的Django系统架构设计;2)HDFS分布式存储与MapReduce/Spark计算引擎对比;3)完整的数据处理流程实现,从原始数据采集到标准化、维度建模、标签打标的全链路开发。系统实现了对B站视频数据的多维度分析,为内容研究

wqq_992250277的博客 1009
上一篇: python能自动解压各种压缩文件,你知道吗?
下一篇: 想知道北京的公交线路图吗?用python给你画出来
python程序员小'鹏
博客等级 码龄6年 163粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值