初始化中...
暂无预设简介,请点击右上角的ShineGPT按钮使用AI实时简介的功能叭!
介绍自己
生成本文简介
推荐相关文章
AI实时简介
系列文章
前言
魔改后端肯定缺少不了数据库的的操作,在qexo中有个数据库操作框架,叫做ORM框架,是做来抹平python与数据库操作之间的繁琐操作,提供统一的操作接口。
这篇文章就说一下怎么自定义一个计数用的数据库,后续读者们可以任意去做自己想要的扩展。因为涉及到数据库操作,所以操作数据库的api我们需要做成私有的api。然后我们再做一个模板用来展示数据库中的计数值,这需要制作一个页面来展示计数值。
预览效果
效果如下:

创建自定义数据库
找到 hexoweb\models.py 文件,在文件末尾添加自定义数据库如下:
1 2 3
| class CountModel(models.Model): id = models.IntegerField(primary_key=True, editable=False) cnt=models.IntegerField(default=0)
|
创建自定义私有api
找到 hexoweb\api.py 文件,在文件的末尾添加私有api方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| from hexoweb.models import CountModel
@login_required(login_url="/login/") def set_count(request): if request.method != "GET": return
try: count, b = CountModel.objects.get_or_create(id=1, defaults={'cnt':0}) count.cnt = count.cnt + 1 count.save() except Exception as error: return JsonResponse(safe=False, data={"msg":"出错啦!", "status":False}) return JsonResponse(safe=False, data={"msg":"设置计数增加1成功!", "status":True})
@login_required(login_url="/login/") def get_count(request): if request.method != "GET": return
try: count, b = CountModel.objects.get_or_create(id=1, defaults={'cnt':0}) except Exception as error: return JsonResponse(safe=False, data={"msg":"出错啦!", "status":False}) return JsonResponse(safe=False, data={"msg":count.cnt, "status":True})
|
创建模板页面
新建 templates\home\count.html 文件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| {% extends 'layouts/base.html' %}
{% block stylesheets %} <style> .container-fluid.mt--6 { margin-top: 50px !important; } </style> {% endblock stylesheets %}
{% block content %} <!-- Page content --> <div class="container-fluid mt--6"> <p id="id-count-sum">0</p> <button onclick="set_count()">设置计数增加1</button> <button onclick="get_count()">获取计数总数显示</button> {% include "includes/footer.html" %} </div>
{% endblock content %}
<!-- Specific JS goes HERE --> {% block javascripts %} <script> function set_count() { let loading = new KZ_Loading('正在删除中...'); loading.show(); $.ajax({ url: '/api/set_count/', method: 'GET', dataType: 'JSON', success: function (res) { loading.destroy(); if (res.status) { notyf.success('设置成功!'); } else { notyf.error(res.msg); } }, error: function (res) { loading.destroy(); notyf.error("网络错误!"); } }) } function get_count() { let loading = new KZ_Loading('正在删除中...'); loading.show(); $.ajax({ url: '/api/get_count/', method: 'GET', dataType: 'JSON', success: function (res) { loading.destroy(); if (res.status) { notyf.success('获取成功!'); $("#id-count-sum").html(res.msg); } else { notyf.error(res.msg); } }, error: function (res) { loading.destroy(); notyf.error("网络错误!"); } }) } </script> {% endblock javascripts %}
|
实现页面处理方法
找到 hexoweb\views.py 文件,在文件末尾添加如下代码:
1 2 3 4 5 6 7 8 9 10
| @login_required(login_url="/login/") def count(request): if not request.user.is_staff: logging.info(f"子用户{request.user.username}尝试访问{request.path}被拒绝") return page_403(request, "您没有权限访问此页面") context = dict() context.update(get_custom_config()) save_setting("LAST_LOGIN", str(int(time()))) html_template = loader.get_template('home/count.html') return HttpResponse(html_template.render(context, request))
|
设置私有api路由和新页面的路由
找到 core\urls.py 文件,添加如下路由设置:
1 2 3 4 5 6 7
| path('', index, name='home'), + path('count/', count, name='count'),
+ path('api/set_count/', set_count, name="set_count"), + path('api/get_count/', get_count, name="get_count"), path('api/auth/', auth, name='auth'), path('api/save/', save, name='save'),
|
Qexo四连
在cmd命令行中输入如下命令运行部署Qexo项目:
1 2 3 4
| E:\Qexo> pip3 install -r requirements.txt E:\Qexo> python3 manage.py makemigrations E:\Qexo> python3 manage.py migrate E:\Qexo> python3 manage.py runserver --noreload
|
访问 http://127.0.0.1:8000/count/ 查看页面效果。