用Django全栈开发——24. CMS的真正的Dashboard开发

未授权访问漏洞全解析:从原理到实战的24种场景与防御 在网络安全领域,访问控制是保障系统安全的核心机制之一,其核心原理在于对用户请求进行身份认证与权限校验。当这一机制存在逻辑缺失或配置疏忽时,便会产生未授权访问漏洞,攻击者无需凭证即可直接访问受保护的资源或执行特权操作,攻击成本极低。这类漏洞的技术价值在于其广泛存在于各类应用、中间件及服务中,是实战中最高频且最易被忽视的安全威胁之一。其典型应用场景涵盖Web应用管理后台、数据库服务(如Redis、MongoDB)、容器与云服务(如Docker API)、监控接口(如Spring Boot Actuator)以及 阅读详情

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程,从零开始,到最后成功部署上线的项目。这一节,用AdminLTE编写Dashboard。

皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码Tag是Post_024

在这里插入图片描述

目前,当我们登录我们的CMS界面,我们看到的是这个样子:

在这里插入图片描述

很丑,不美观。所以这几节,我们将要开发一款真正意义上的CMS Dashboard。具体开发完成长这个样子:

在这里插入图片描述

我们看到,具体分为这么几个部分:

  • 用户访问
  • 文章统计
  • 若是想加,还可以加其他的功能

这些东西我们其实都是可以做出来的,接下来的几节课,我们就来讲讲每一个部分都是怎么实现的。

用户访问统计

首先是用户访问统计,我们要统计每一个用户的访问请求,同时要记录每天网站访问人数,那么我们就需要创建模型了。

这个模型应该是属于全站使用,所以我们就在basefucntion/models.py下面的创建:

class UserIP(models.Model):
    ip_address = models.CharField(max_length=30)
    ip_location = models.CharField(max_length=30)
    end_point = models.CharField(default='/', max_length=30)
    day = models.DateField(default=timezone.now)


# 网站总访问次数
class VisitNumber(models.Model):
    count = models.IntegerField(default=0)  # 网站访问总次数


# 单日访问量统计
class DayNumber(models.Model):
    day = models.DateField(default=timezone.now)
    count = models.IntegerField(default=0)  # 网站访问总次数

接着,我们在base应用下,创建一个tracking_view.py,里面要放我们的更新方法,即最终网站访问数量的方法:

def peekpa_tracking(func):
    def wrapper(request, *args, **kwargs):
        tacking_info(request)
        return func(request, *args, **kwargs)
    return wrapper


def tacking_info(request):
    update_visit_number()
    update_user_ip(request)
    update_day_visit_number()


def update_visit_number():
    count_nums = VisitNumber.objects.filter(id=1)
    if count_nums:
        count_nums = count_nums[0]
        count_nums.count = F('count') + 1
    else:
        count_nums = VisitNumber()
        count_nums.count = 1
    count_nums.save()


def update_user_ip(request):
    if 'HTTP_X_FORWARDED_FOR' in request.META:  # 获取 ip
        client_ip = request.META['HTTP_X_FORWARDED_FOR']
        client_ip = client_ip.split(",")[0]  # 所以这里是真实的 ip
    else:
        client_ip = request.META['REMOTE_ADDR']  # 这里获得代理 ip

    UserIP().objects.create(ip=client_ip, end_point=request.path, ip_address="TBA", day=timezone.now().date())


def update_day_visit_number():
    date = timezone.now().date()
    today = DayNumber.objects.filter(day=date)
    if today:
        temp = today[0]
        temp.count += 1
    else:
        temp = DayNumber()
        temp.dayTime = date
        temp.count = 1
    temp.save()

首先,这里我们要通过装饰器的方式来实现,当request进来的时候,我们做了三步处理:

  1. 更新总网站访问量;
  2. 更新个人访问记录;
  3. 更新每天访问数量。

然后再将request交给传入的func去做接下来该做的事儿。

我们这个时候可以在文章的detail信息做一下验证:

@peekpa_tracking
def detail(request, time_id):

这个时候,我们再去打开之前发布的任何一个文章:

在这里插入图片描述

访问成功之后,我们看数据库里面:

在这里插入图片描述

就能看到我们跟踪的信息已经存到了数据库中了。说明成功了。接下来我们就要来做Dashboard的统计工作。

页面统计的显示

我们在最开始的预览图里面看到,我们的Dashboard页面是有网站点击相关统计的内容显示的,接下来,我们就将这些东西显示出来。

如果我们要将数据显示到Dashboard上,那么就应该在Dashboard的home视图函数中,先提前将数据准备好,然后再传递给页面即可。

所以,我们的主要逻辑就应该在cms_dashboard(request)视图方法中写。

@peekpa_login_required
def cms_dashboard(request):
    context = {}
    context.update(get_dashboard_top_data())
    context.update(get_dashboard_visitor_ip_table())
    return render(request, 'cms/home/home.html', context=context)
    
def get_dashboard_top_data():
    post_num = Post.objects.all().count()
    day_visit_ip_set = set()
    day_visit_ip_list = UserIP.objects.filter(day=timezone.now().date())
    if day_visit_ip_list:
        for user_ip_item in day_visit_ip_list:
            if user_ip_item.ip_address not in day_visit_ip_set:
                day_visit_ip_set.add(user_ip_item.ip_address)
    day_visit_ip_num = len(day_visit_ip_set)
    day_visit_num = DayNumber.objects.filter(day=timezone.now().date())[0].count
    total_visit_num = VisitNumber.objects.filter(id=1)[0].count
    context = {
        "post_num": post_num,
        "day_visit_ip_num": day_visit_ip_num,
        "day_visit_num": day_visit_num,
        "total_visit_num": total_visit_num
    }
    return context
    
def get_dashboard_visitor_ip_table():
    visitor_data = UserIP.objects.filter(day=timezone.now().date())
    if len(visitor_data):
        visitor_data = visitor_data[:7]
    context = {
        'visitor_data_list': visitor_data,
    }
    return context

可以看到,我们这里使用两个方法get_dashboard_top_data和get_dashboard_visitor_ip_table来分别获取顶部四个小模块的数据还有Visitor IP Table的数据。我们拿到数据之后,就展示到前端:

在这里插入图片描述

接下来,我们就要完善Chart的内容了。

图表显示

这里可以看到,我们的Dashboard用到了一个非常美丽的表单,这个是Chart.js,是一个非常好用的图表库。官网地址:

https://www.chartjs.org/

因为我们首先需要将值从后台传给前端,然后这个图标是个js文档,所以,我们应该在html代码中,编写一些js代码。我们的home_visit_chat.html代码就应该变成下面这样:

<script>
    $(document).ready(function () {
        var ticksStyle = {
            fontColor: '#495057',
            fontStyle: 'bold'
        }
        var $visitorsChart = $('#visitors-chart')
        var visitorsChart2 = new Chart($visitorsChart, {
            data: {
                labels: {{ date_time_list }},
                datasets: [{
                    type: 'line',
                    data: {{ week_data_list }},
                    backgroundColor: 'transparent',
                    borderColor: '#007bff',
                    pointBorderColor: '#007bff',
                    pointBackgroundColor: '#007bff',
                    fill: true
                }]
            },
            options: {
                maintainAspectRatio: false,
                tooltips: {
                    mode: 'index',
                    intersect: true
                },
                hover: {
                    mode: 'index',
                    intersect: true
                },
                legend: {
                    display: false
                },
                scales: {
                    yAxes: [{
                        // display: false,
                        gridLines: {
                            display: true,
                            lineWidth: '4px',
                            color: 'rgba(0, 0, 0, .2)',
                            zeroLineColor: 'transparent'
                        },
                        ticks: $.extend({
                            beginAtZero: false,
                            suggestedMax: {{ suggested_max }}
                        }, ticksStyle)
                    }],
                    xAxes: [{
                        display: true,
                        gridLines: {
                            display: false
                        },
                        ticks: ticksStyle
                    }]
                }
            }
        })
    })
</script>

可以看到,这里面有好多数据都是需要后盾传送给前端,所以,我们将这些数据都读取出来,添加给cms_dashboard()视图函数即可:

def get_dashboard_visitor_chart():
    days_list = []
    visit_list = []
    max_num = 0
    week_total_num = 0
    for index in range(6, -1, -1):
        day, format_date = get_before_date(index)
        days_list.append(int(day))
        day_visit_num = 0
        daynumber_item = DayNumber.objects.filter(day=format_date)
        if daynumber_item:
            day_visit_num = daynumber_item[0].count
        visit_list.append(day_visit_num)
        week_total_num += day_visit_num
        max_num = day_visit_num if day_visit_num > max_num else max_num
    context = {
        'visit_week_total_number': day_visit_num,
        'date_time_list': days_list,
        'week_data_list': visit_list,
        'suggested_max': max_num
    }
    return context

这样,我们的图表就制作完成了。看一下效果:

在这里插入图片描述

最后一个,就是我们的文章浏览情况了。

文章阅读情况

文章阅读,我们既然已经知道了每一天的访问量,而且他们访问的地址我们也知道,所以,文章的访问我们就能够很轻易的做出来。

同样,还是在cms_dashboard视图函数里面添加数据即可。

def get_dashboard_post_view_table():
    visitor_day_data = UserIP.objects.filter(day=timezone.now().date(), end_point__contains='/detail/')
    post_map = {}
    post_view_table_list = []
    if visitor_day_data:
        for item in visitor_day_data:
            post_id = item.end_point.split('/')[2]
            if post_id in post_map:
                post_map[post_id] += 1
            else:
                post_map[post_id] = 1
    if post_map:
        for key in post_map:
            key = key
            post_item = Post.objects.filter(time_id=key)
            if post_item:
                post_item[0].inscrease = post_map[key]
                post_view_table_list.append(post_item[0])
    if post_view_table_list:
        post_view_table_list.sort(key=lambda x: x.inscrease, reverse=True)
    context = {
        'post_view_table_list': post_view_table_list,
    }
    return context

这里我们操作比较繁琐,主要是经历了这么几步骤:

  1. 读取当天文章点击情况;
  2. 获取出来文章列表,并将这些数据存储在一个字典中,key是id,name是文章个数;
  3. 从Post里面捞出来这些文章,然后排序返回给前端展示。

最后,我们来看一下整体的效果:

在这里插入图片描述

看到整个页面分为四个板块,然后左侧还做了Monitor,里面分别对应的UserIP管理还有文章阅读详情。其实Dashboard的编写,还能更加多变灵活,关键还是要根据自己的实际需求来完成。

文章统计

最后我们再来加一章节,来说一下文章统计的事儿。

细心读文章的同学肯定发现了,我们之前的文章统计的数值是不对的,那么想要实现文章统计,我们有这么几个思路:

  1. 每一次请求文章的时候,我们从数据库读取文章对象,然后把Post里面的read_num喜加一,再存进去;
  2. 稍微设置一下缓存,通过的F表达式,来做懒加载处理;
  3. 将文章的“喜加一”功能,放到MemoryCache或者Reddis里面做处理。

这几种思路,他们的特点分别是:

  1. 实现简单,但是耗费数据库开销严重;
  2. 实现一般,可缓解一定的数据库开销,但是当网站规模增大的时候,高并发会出问题;
  3. 实现有难度,但是可以扛得住高并发的问题。

既然,我们的peekpa.com也不是什么一般的小网站,这里我就选择第二种实现方式给大家看看。

这里来简单说一下思路:

当用户访问文章详情的时候,会针对用户生成一个uid,这个uid在不同的文章里面,缓存1分钟。1分钟之内用户重复访问,不算访问量。然后懒加载更新数据库。

这回,我们就要用到了middleware了。首先在Post应用下,创建一个middleware python包,然后在里面实现一个叫做user_id的middleware:

在这里插入图片描述

class UserIDMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        uid = self.generate_uid(request)
        request.uid = uid
        response = self.get_response(request)
        response.set_cookie(USER_KEY, uid, max_age=TEN_YEARS, httponly=True)
        return response

    def generate_uid(self, request):
        try:
            uid = request.COOKIES[USER_KEY]
        except KeyError:
            uid = uuid.uuid4().hex
        return uid

然后,我们要在settings.py文件里面的MIDDLEWARE中,在第一个位置添加这个middleware:

MIDDLEWARE = [
    'apps.poster.middleware.user_id.UserIDMiddleware',
]

最后,我们就在文章详情请求页里面,来加入我们上面所讲的逻辑:

@peekpa_tracking
def detail(request, time_id):
    handle_visited(request, time_id)
    return render(request, 'post/detail.html', context=context)
    
def handle_visited(request, time_id):
    increase_post_view = True
    uid = request.uid
    pv_key = 'pv:%s:%s' % (uid, request.path)
    if not cache.get(pv_key):
        increase_post_view = True
        cache.set(pv_key, 1, 2*60)

    if increase_post_view:
        Post.objects.filter(time_id=time_id).update(read_num=F('read_num') + 1)

这样,我们就完美的实现了页面访问喜加一的功能。

技术总结

最后总结一下,

编写CMS的Dashboard:

  1. 用户统计,需要创建模型来存储管理,我们这里创建了UserIP,VisitNumber还有DayVisitNumberr,分别管理单次点击,整个点击还有每天的点击量;
  2. Dashboard还是要拆开分结构,顶部四个小方块,然后拆成四个表格;
  3. 在cms_dashboard()这个视图函数里面添加数据返回前端;
  4. 添加数据,按照模块一步一步的处理;
  5. Chartjs,这里我们在html模板里面写了JavaScript代码,同样也是;
  6. 文章排序,则是通过每日访问里面的end_point值获取到文章id,然后再去Post里面根据ID找文章,最后展示出来;
  7. 页面喜加一,则是用到了MiddleWare来给request添加一个uid,然后当request到达视图函数的时候,通过uid是否在缓存里来判断是否需要喜加一;
  8. 完毕

整套教程源码获取,可以关注『皮爷撸码』,回复『peekpa.com』

长按下图二维码关注,如文章对你有启发,欢迎在看与转发。

在这里插入图片描述

利用 django 及 pyecharts 做一个简单dashboard 展示页面 本项目就是利用 django 及 pyecharts 做一个简单dashboard 展示页面。 只有1个模板页,可自行扩展。数据部分单独模块,无数据库访问代码,可修改为从数据库读取数据。有需要,可以联系我,代码中有邮箱地址。 立即下载

相关推荐

Xiaojie雷达之路---毫米波雷达基础知识---角度估计

本篇文章主要介绍毫米波雷达的基础知识中的角度估计,对于本篇文章主要回答5个问题 1.在雷达的前方,如何估计前方一个物体的角度 2.角度测量的准确性 3.如何测量多个物体的角度 4.雷达可测的角度的视场最大值为多少 5.角度分辨率取决于什么因素 文章目录估计雷达前面一个物体的角度角度测量的准确性雷达的最大角视场测量雷达前方多个距离和速度相同的物体角度分辨率角度估计的流程 估计雷达前面一个物体的角度 估计一个物体的角度,最少需要两根接收天线 发射天线发送一个chirp,经过物体发射后信号,信号分别被第一根天

XiaoJie的博客 1万+

Python开源内容管理系统: Djangocms

它采用了Django框架,可以快速构建高效、灵活的网站。2.中国科学院官网:中国科学院采用了Djangocms搭建官方网站,通过定制插件和主题,使得网站具有更好的交互性和可扩展性。3.知乎日报:知乎日报采用了Djangocms搭建新闻资讯网站,并通过定制插件和主题,使得网站更加符合用户需求。1.插件:Djangocms提供了丰富的插件,包括图像、视频、音频、表格等多种类型,可以满足不同用户的需求。1.灵活性高:Djangocms提供了众多的插件和主题,可以根据自己的需求进行定制,满足不同用户的需求。

caridle的专栏 2855

手把手教你用SpringBoot+Vue3+Docker从零搭建一个在线OJ系统(附完整源码)

本文详细介绍了如何使用SpringBoot、Vue3和Docker从零搭建一个在线OJ系统,涵盖前后端开发、判题机实现及Docker容器化部署。通过完整的源码和实战步骤,帮助开发者掌握OJ系统的核心架构与关键技术,适用于算法训练、编程竞赛等场景。

weixin_42648844的博客 296

Docker部署开源项目Django-CMS企业内容管理系统

Docker部署开源项目Django-CMS企业内容管理系统

jks212454的博客 6543

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

三相SST固态变压器详细设计案例

本案例针对400kVA、30kHz三相固态变压器(SST)开展详细设计,核心采用输入串联输出并联(ISOP)拓扑架构(模块化多电平矩阵变换器M3C简化版),重点完成高频变压器的参数计算、绕组设计、损耗分析及液冷温升验证,同时覆盖系统级架构设计、半导体损耗估算及整机效率优化,全流程基于当前电力电子技术可行性展开。

qq_32103755的博客 3284

Django CMS 入门指南(一)

在本章中,我们简要探讨了内容管理的历史以及现代基于计算机的内容管理系统(CMS)是如何工作的。我们已经了解了 django CMS 如何融入这个生态系统,并强调了它的一些主要优势。我以这本书的简要概述和你可以期待的结尾结束。在下一章中,您将通过安装 django CMS 应用及其依赖项开始使用 django CMS。在这一章中,我们已经介绍了 Python 和 django CMS 的安装和配置,结果是一个漂亮干净(尽管是空的)的 django CMS 网站。

龙哥盟 2300

Windows部署小龙虾 OpenClaw 报错不断?参考这篇文章,轻松配置 OpenClaw 所需环境

想在Windows上部署OpenClaw却频频报错?🔧 本文详细梳理了OpenClaw部署必需环境的安装步骤和官方下载地址 📦,提供完整的验证清单和常见问题排查方法,帮你一次性搞定所有环境配置,顺利部署OpenClaw ✅

XiaoqiangClub的博客 361

Django CMS 入门指南(二)

本章到此为止。现在,您应该有几个页面和文章添加到您的网站,并完全了解如何管理用户和组织内容。在下一章中,我们将通过侧边栏菜单向用户展示你全新的博客页面,同时查看网站的其他导航工具:面包屑和网站地图。django CMS 菜单系统既灵活又可扩展。用自定义条目静态扩展现有菜单。创建链接到您的应用和插件的自定义菜单。将自定义菜单附加到页面。创建将修改整个菜单树的导航修饰符(例如,应用特殊格式)。

龙哥盟 2802

【AI大模型应用开发实战】大型语言模型评估指南白皮书(LLM Eval)

近年来,大型语言模型(LLM)在自然语言处理领域取得了重大进展,例如 GPT-3 和 Chat-GPT。这些模型经过大型数据集的训练,在文本相关任务中表现出卓越的能力,甚至超越了人类。本文将简要介绍如何验证 LLMs 性能的评估指标。自然语言处理(NLP)是人工智能的一个领域,涉及计算机和人类语言之间的交互。NLP 的基本任务之一是语言建模 (LM),它涉及构建统计模型来分析和生成自然语言。LM 已成为推进机器语言智能的关键方法,使机器能够执行机器翻译、情感分析和对话系统等任务。

AI天才研究院 1011

智护健康:基于 ESP32 的可穿戴式心率血氧远程监测手环设计与实现

随着健康管理理念的普及,可穿戴式健康监测设备成为刚需。本文设计了一款基于 ESP32 芯片的可穿戴式心率与血氧远程监测手环,通过集成专业生物传感器采集生理数据,借助 ESP32 的无线通信能力实现数据远程传输,搭配手机 APP 与云平台完成数据存储、分析与预警。文中详细阐述了硬件选型、模块接线、软件设计流程及核心代码实现,该手环具备低功耗、高精度、实时性强等特点,可满足日常健康监测与远程照护需求。

weixin_42300449的博客 1198

Django-CMS: 动态构建强大、灵活的网站

Django-CMS: 动态构建强大、灵活的网站 项目地址:https://gitcode.com/gh_mirrors/dj/django-cms Django-CMS 是一个基于 Python 的开源内容管理系统(CMS),它允许开发者轻松地创建和管理网站内容。通过充分利用 Django 框架的功能和灵活性,Django-CMS 提供了一个易于使用的界面来实现动态网站的快速开发。 什么是 Dj...

gitblog_00010的博客 3245

SPSS 多重共线性问题:编程解决方案

多重共线性会导致回归模型的不稳定性,使得估计的回归系数失去解释力,降低模型的准确性和可靠性。通过执行这些代码,你将能够计算和查看VIF和CI的结果,并确定是否存在多重共线性问题。上述代码执行了一个回归分析,其中A是我们感兴趣的因变量,B、C、D和E是我们要检查的自变量。接下来,我们将执行多重共线性的检测。通过执行上述代码,你将能够看到每个自变量的VIF和CI值,以及预先设置的阈值。上述代码将计算VIF和CI的值,并将结果写入指定路径的结果文件中。接下来,我们可以使用以下代码来计算和显示VIF和CI的值。

CyberGenius的博客 1426

Centos环境django项目部署过程

Django是一款针对Python环境的开源WEB开发框架,采用BSD license,能够帮助我们快速开发安全和可维护的网站。它采用MTV 架构: 采用 Model(模型)、Template(模板)、View(视图)模式,强制代码分离,结构清晰,非常适合团队协作和大型项目维护。它还提供了DRF(Django REST Framework): 是构建 API 的行业标准工具包。如果你需要开发前后端分离的项目(如配合 React/Vue 前端或移动端 App),DRF 提供了强大的序列化、认证和视图集功能。

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 688

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Saleor Core 架构解析:基于 Python/Django 的高性能可组合无头电商 API 平台

Saleor Core 是一个 **GraphQL 原生、纯 API 驱动**的开源电商后端引擎,以"与你的语言和栈协同工作"为设计理念,为可组合式(composable)电商提供可独立部署、可独立扩展的基础能力。本文以仓库根目录 [README.md](https://link.gitcode.com/i/b929ee40c36152c57a3f236d4eea52ca) 为主线,结合仓库源码、

gitblog_00966的博客 698

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

5 步跑通 Open edX:从克隆到可上线的最小部署教程

你接了个给机构开在线课的需求,Open edX 部署听着吓人,其实就是把仓库里 lms/ 和 cms/ 两个 Django 服务跑起来。这篇教程走一遍从克隆到启动的最小路径,每步都有核对点。 Open edX 是 edX 开源的在线教育系统,Python 加 Django 写成,核心只提供两个服务:LMS(学员用的学习系统)和 CMS(Studio,教师端录课后台)。把这两个服务跑起来,平台就算

gitblog_00622的博客 407

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Open edX 部署教程:从零跑通开源在线教育平台的完整路径

想给自己的学校、企业或社群搭一套不被商业 SaaS 绑定的在线课堂?Open edX 部署是目前被验证得最多的开源路线:一个仓库同时交付学生学习端和教师备课端,建课、授课、测验、发证、运营全链路都有,全球大量高校和企业学习站就架在它上面。 **它是什么,凭什么?** Open edX 是 edX 大学计划开源出来的学习平台核心,Python + Django 做后端,React 微前端做界面,整

gitblog_00077的博客 463

Open edX部署实战指南:从拉取代码到跑通 LMS 与 Studio 的 6 个步骤

你的团队想在两周内上线一门在线课程,有人告诉你开源方案就是 Open edX——它把 LMS(学生学习门户)和 Studio(教师课程制作后台)两个核心服务装在一个模块化单体里。这是一篇 Open edX 部署上手:带你从 openedx-platform 仓库把本地实例跑起来,讲清每一步怎么算成功,以及遇到问题时去哪里找答案。 ## 先看懂你克隆的是什么:单体 + 微前端两层 打开仓库根目录

gitblog_00582的博客 868

如何用 Arnis 免费将现实地形转Minecraft地图(新手完整指南)

把家附近那条街、那片河谷原样搬进《我的世界》,楼和河都按真实位置摆好——这就是 Arnis 做的事。它是一款免费开源工具,读取 OpenStreetMap 数据和真实高程数据,完成现实地形转Minecraft地图的全过程,支持 Java 版(1.21.4+)、基岩版和 Luanti。框选一个区域,点一下生成,得到的世界可以直接放进存档目录,打开就能走。 [![Arnis 生成的现实地形Minec

gitblog_00382的博客 404

Open edX 学习平台部署与配置实战:从最小启动到生产落地的路径

Open edX 是基于 Python 和 Django 的开源在线学习平台,包含 LMS(学生学习端)与 Studio(课程创作端,仓库中称 CMS)两个核心服务。本文不堆背景,直接解决三个问题:这套平台部署在你手上是否合适、最小可用实例怎么跑通、出问题时按什么顺序排查。 ## 先确认 Open edX 是否匹配你的需求 判断前先认识仓库结构,它决定了你后续改什么、看什么: - `lms/

gitblog_00080的博客 688

database-architect Agent 实战指南:基于 agents24/agents 插件市场的可扩展数据库架构设计专家

本篇以本仓库(agents24/agents——面向 Claude Code、Codex、Cursor、OpenCode、GitHub Copilot、Google Antigravity 的多 Harness 智能体插件市场)中的 [database-architect Agent](https://link.gitcode.com/i/6d7de18124f28ae1ed7b515cd7e7e

gitblog_00017的博客 378

Open edX平台企业级部署实战:从架构设计到生产环境优化

Open edX是全球领先的开源在线教育平台,为教育机构提供完整的LMS学习管理系统和CMS内容管理系统解决方案。作为模块化单体架构的典范,该平台采用Python和JavaScript构建,深度集成Django框架,支持大规模在线教育服务的快速部署与扩展。 ## 核心架构深度解析 Open edX采用创新的模块化单体架构,将传统单体应用与微前端(MFE)模式相结合。平台核心由两大服务构成:CM

gitblog_00360的博客 481

OpenCore Legacy Patcher 完整指南:老 Mac 安装新版 macOS 的分步实战教程

OpenCore Legacy Patcher(下称 OCLP)是一个基于 Python 的开源工具,用来给已被苹果官方停止支持的 Intel Mac 打引导补丁,让 2007 年前后的老机器也能安装并使用 macOS Big Sur 及更新版本。如果你是第一次接触这个工具,这篇教程会从确认机型支持讲起,带你走完整条安装与补丁流程,并附上常见故障的速查方案。 [![OpenCore Legacy

gitblog_01097的博客 411

OpenCodex 自定义模型芯片前端实现指南:模型页面的新增/编辑/删除 UI 与悬停信息弹层

> 本文以 OpenCodex 开发日志 [260722_custom-model-chip/020_phase2.md](https://link.gitcode.com/i/69ad10d7473f62d433052443fd817f9b) 为主体,系统讲解在模型管理页面(Models)中落地"自定义模型"完整交互层(Provider 头部 "+" 按钮、新增/编辑模态框、模型行徽章、悬停信息

gitblog_01065的博客 265

Agent Runtime 正在成为 AI 时代的操作系统层

Agent runtime 是支撑大模型智能体持续、安全、可审计运行的底层基础设施,其核心在于解耦状态管理、强化沙箱隔离、标准化工具调用。它并非新概念,而是对 LLM 上下文局限性与生产环境稳定性矛盾的工程回应。关键技术价值体现在会话持久化(event log)、无状态执行(harness)、牛式沙箱(cattle-style sandbox)三大设计上,直接决定 agent 在真实业务场景中的可靠性、可观测性与合规性。典型应用场景包括销售线索分发、客服自动化、研发辅助等需跨工具、长周期、高安全要求的任务。

weixin_34302561的博客 364

PyCharm专业版合法授权指南:教育许可与订阅机制详解

PyCharm专业版是Python开发中支持Web框架、数据库集成与科学计算的核心IDE,其授权机制已从静态激活码全面转向基于JetBrains账户的订阅制服务。该模式依托OAuth2.0令牌验证与JWT动态权限管理,确保安全更新、语法支持与插件兼容性持续交付。教育授权(Education License)作为零成本合规路径,面向师生提供全功能、多端激活与自动续期能力;开源贡献者、初创团队及个人开发者亦可通过认证计划或阶梯订阅获得稳定使用权。误用非官方激活工具将破坏IDE完整性,引发调试失败、SSL异常与C

weixin_33857679的博客 399
上一篇: 用Django全栈开发——23. 增加访问权限以及404页面
下一篇: 用Django全栈开发——25. 利用request.session开发数据中心功能
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值