当前位置: 首页 > news >正文

一键下载小说(二):如何在Django中部署

一键下载小说(二):如何在Django中部署

  • 分析
  • 流程
  • 实现
    • Myappname / views.py
    • Myappname / templates / novelCc.html
  • 部署
    • Myprojectname / urls.py
    • Myappname / urls.py
  • 运行
    • 自动下载
    • 窗口列表
  • 笔记

分析

在Django服务器中实施部署长时段的在线任务有两个关键的问题,如参数传递和超时问题。参数传递的HTTP/HTTPS传输方式一般有两种:GET和POST方法。GET方法使用明文将参数拼接在URL地址后面传输,而POST则将表单参数加密后再发送,对于用户是不可见的。本文中的案例中,在本地搭建小说下载器,使用GET方法。至于超时问题,通常的惯例做法是在客户端使用Javascript脚本进行跳转或表单提交。需要的参数通过客户端Form表单提交和服务端渲染Django模板返回的组合方式进行交换。

流程

Created with Raphaël 2.3.0 开始 客户端提交Form表单 服务端处理表单参数 下载小说章节HTML源文件 保存小说章节内容 分析提取其他关键数据 判断是否终止翻页 结束 客户端Javascrip提交Form表单 yes no

实现

Myappname / views.py

def novel_cc(request):
    counter, book, referer, cookies = 0, None, None, None
    if request.method == 'GET':
        url = request.GET.get('url')
        if url is not None and httpkit.valid_https(url):
            book = request.GET.get('name', 'unk_' + hashio.md5(url))
            counter = int(request.GET.get('index', 1))
            referer = request.GET.get('from', None)
            cookies = request.GET.get('token', None)
            print(url, book)
            text, next_page, referer, cookies = cdxsw_cc_1.test(start_url=url, index=counter, referer=referer,
                                                                cookies=cookies,
                                                                book_name=book)
            print(counter, referer, cookies)
        else:
            next_page, referer, cookies = None, None, None
    else:
        next_page, referer, cookies = None, None, None
    counter += 1
    context = {'index': counter, 'book': book, 'next': next_page, 'from': referer, 'token': cookies}
    return render(request, 'Myappname/novelCc.html', context)

Myappname / templates / novelCc.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    {% if index %}
    <title>Page {{index}}</title>
    {% else %}
    <title>Novel</title>
    {% endif %}
</head>
<body>
<form id="book-form" action="/Myprojectname/novelWidget/" method="get">
    {% if index %}
    <label for="counter">Page:</label>
    <input id="counter" name="index" value="{{index}}" hidden>
    {% else %}
    <label for="counter">Page:</label>
    <input id="counter" name="index" value="1" hidden>
    {% endif %}
    {%csrf_token%}
    <label for="input2">书名: </label>
    {% if book %}
    <input type="text" id="input2" name="name" value="{{book}}">
    {% else %}
    <input type="text" id="input2" name="name">
    {% endif %}
    {% if next %}
    <script type="text/javascript">
        setTimeout(function(){var book_form = document.getElementById("book-form"); book_form.submit();}, 3000);
    </script>
    <label for="input1">下一页: </label>
    <input type="text" id="input1" name="url" value="{{ next }}">
    {% else %}
    <label for="input1">输入URL: </label>
    <input type="text" id="input1" name="url">
    {% endif %}
    {% if from %}
    <label for="input3">上一页: </label>
    <input id="input3" name="from" value="{{from}}">
    {% endif %}
    {% if token %}
        {% if not next %}
            <script type="text/javascript">alert('End!');</script>
        {% endif %}
    <input name=“token" value="{{token}}">
    {% endif %}
    <input type="submit" value="搜索" class="sub">
</form>
</body>
</html>

部署

Myprojectname / urls.py

"""Myprojectname URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path


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

Myappname / urls.py

"""Myappname URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.urls import path
from . import views


app_name = 'Myappname'
urlpatterns = [
    path('novelWidget/', views.novel_cc, name='novelWidget'),
]

运行

自动下载

Django部署小说下载器运行图

窗口列表

窗口任务栏显示运行进度

笔记

渲染Django模板HTML时,也可以选择原生HTML源代码。只不过Django模板输出HTML代码时,默认进行转义操作,可能避免一些意外的“麻烦”。本案例中,使用Django模板语言也很简洁。

相关文章:

  • Java线程基础-CountDownLatch-批量执行多线程完成,再由主线程发起
  • 语音信号处理:torchaudio库【STFT、Spectrogram、MelSpectrogram、MFCC、LFCC】
  • 顶级接口Collection
  • ERP采购管理 金蝶
  • 【Linux】系统安装
  • 微服务项目:尚融宝(9)(后端接口:统一返回结果)
  • 『每日算法 · 基础知识篇』备战面试,坚持算法 第一话——对数器!
  • 【开卷数据结构 】2-3树
  • C/C++教程 从入门到精通《第二十一章》——Qt界面开发
  • STM32学习笔记:读写内部FLASH
  • Git 实战(三) | Github 必会高频基础命令与 IDE 的 Git 集成
  • Docker 镜像构建可以分享的快乐
  • ADC_内部电路Rsh和Csh和转换速率Tconv以及频率fs
  • Hive的基本操作
  • vue、vscode格式规范prettier、eslint、git commit
  • 深入了解以太坊
  • [LeetCode] Wiggle Sort
  • 【css3】浏览器内核及其兼容性
  • 【React系列】如何构建React应用程序
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CODING 缺陷管理功能正式开始公测
  • iOS小技巧之UIImagePickerController实现头像选择
  • js操作时间(持续更新)
  • js继承的实现方法
  • Object.assign方法不能实现深复制
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Vue2.0 实现互斥
  • webpack4 一点通
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于字符编码你应该知道的事情
  • 解析带emoji和链接的聊天系统消息
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端之React实战:创建跨平台的项目架构
  • 数据科学 第 3 章 11 字符串处理
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​​​​​​​​​​​​Γ函数
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #Ubuntu(修改root信息)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (6)STL算法之转换
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)ObjectiveC 深浅拷贝学习
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***测试-HTTP方法
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .chm格式文件如何阅读
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET框架设计—常被忽视的C#设计技巧