分类目录归档:网站设计

Django Celery 异步与定时任务实战教程

Django与Celery是基于Python进行Web后端开发的核心搭配,在运营开发(即面向企业内部)的场景中非常常见。

下面是基于Django的Celery异步任务和定时任务的实战教程,大家觉得有用的话点个赞/在看吧!

1.配置Django Celery

配置celery主要有几点:

1. 在settings.py的同级目录下,创建celery.py文件(名字自己随意取),这个文件主要是用来生成celery的实例app.

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NBAsite.settings')

app = Celery('NBAsite',broker='redis://localhost:6379/0',backend='redis://localhost')
app.config_from_object('django.conf:settings',namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

我们将 celery 实例的 broker 和 backend 都设为了redis.

其中 broker 的意思是“经纪人”,像股票经纪人一样,是用于促成“交易”的,Celery中它的职责就是给 worker 推送任务。

而backend的职责是存放执行信息和结果,这些数据需要被持久化存于数据库。但为了简化问题,我们将其与broker一样放置于redis当中。

2. 需要你在自己已经创建的app(不是celery的app,而是django项目的app)目录下面,创建task.py文件(这个文件名只能是这个)

因为Celery会统一从每个app下面的tasks里面监听任务。

3. 编写tasks.py的任务

看一下tasks内部的任务如何写:

from __future__ import absolute_import, unicode_literals
from NBAsite.celery import app
from celery import shared_task
import time

@shared_task
def waste_time():
    time.sleep(3)
    return "Run function 'waste_time' finished."

任务的目标是延迟3秒后,返回一个语句。

4. init.py中的设置

这个是非常关键的一点,如何让django在启动的时候,也把celery给启动了呢?
答案是在项目的init文件内,导入celery的app

from __future__ import absolute_import, unicode_literals
import pymysql

from .celery import app as celery_app

pymysql.install_as_MySQLdb()
__all__ = ('celery_app',)

2.Django 其他配置

为了能够触发该异步任务,我们接下来配置一些常规文件,views和url,首先是views函数:

from .tasks import waste_time

def test_c(request):
    result = waste_time.delay().get()
    return JsonResponse({'status':'successful'})

然后是url:

path('test_c', test_c, name='test_c'),

3.进行测试

首先,运行django项目

python manage.py runserver

这样,django项目和celery的app就被一起启动了,但是这个时候是无法执行这个task的,因为worker没有被启动,我们可以试一下:

访问http://127.0.0.1:8000/stats/test_c 会得到以下报错:

正确的姿势是怎么样的?需要先激活worker,然后再访问API:

celery -A NBAsite worker -l info

从上图下方的log信息里可以看到,在延迟了3秒后,任务启动并返回字符串,而在页面上,也可以看到成功返回。

需要注意的是,如果你修改了tasks的内容,是需要重启celery才能生效的,最简单的方法就是重启django项目。

这样,我们就完成了简单的异步任务的配置和使用。

4.定时任务配置

在异步任务中,我们只用到了worker,而在定时任务中,还要用到celery的beat调度器。

首先来看下如何配置定时任务,或者说如何配置这个调度器。

还是在celery.py里面进行配置:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NBAsite.settings')

app = Celery('NBAsite',broker = 'redis://localhost:6379/0',backend='redis://localhost')

app.config_from_object('django.conf:settings',namespace='CELERY')

app.conf.beat_schedule ={
        'autosc':{                           
            'task':'stats.tasks.auto_sc',    
            'schedule':crontab(hour=20,minute=47),   
        },
}
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

重点是增加了app.conf.beat_schedule这个定时任务配置,指定了 stats 文件夹下 tasks.py 中的auto_sc函数,定时于20:47分执行。

5.具体任务页面tasks

增加一个对应要做定时任务的task

@shared_task
def auto_sc():
    print ('sc test?')
    return 'halo'

6.运行命令和结果

命令的话可以将激活worker和激活beat合并在一起,如下:

celery -A NBAsite worker -B -l info

不过,windows不被允许这么使用,因此在windows环境下,你需要同时打开worker和beater:

celery -A NBAsite worker -l info
celery -A NBAsite beat -l info

看上图下方的log可知定时任务被成功执行。

参考资料:
https://www.jianshu.com/p/173070bcdfaf
https://www.jianshu.com/p/ee32074a10de

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

healthchecks, 基于Django监控Cron任务的神器

在运维服务器的时候经常会用到一些Crontab任务。

当你的Crontab中的任务数超过10个的时候,你会发现这些任务管理起来非常困难。

尤其是当这些Cron任务执行失败的时候,比如 Python 实用宝典网 每个月初都会执行一次https证书刷新,有一次协议更新之后,我的脚本失效了三个月,导致证书过期时网站宕机了一天,直到我发现并修复了这个问题。

这就是Crontab任务的一个劣势:没有方便的通知功能。

不过,现在有一个非常方便的开源Django项目能在这些Crontab失效的时候通知你,它就是healthchecks.

它通过一个回调接口判断你的Crontab任务有没有顺利执行。

比如说你有一个python脚本定时执行,healthchecks给定的回调URL是:

http://localhost:8000/ping/880cb4d2

在配置Crontab脚本的时候,就需要这么写:

8 6 * * * python /home/user/test.py && curl -fsS -m 10 --retry 5 -o /dev/null http://localhost:8000/ping/880cb4d2

如果未按时调用回调接口,healthchecks将会通过邮件等通知方式告警。

那么这个“未按时”能否设定宽限呢?比如我有个任务要跑1个小时左右,那么这个任务应该是预计在一个半小时内调用(Ping)回调接口,超过一个半小时如果没有调用回调接口则告警。答案是肯定的。

上图中Period指的是两次Ping之间的时间间隔。下方Grace表示“宽限期”,自从上次Ping以来的时间已超过Period+Grace则会发送告警通知。

如果你用不习惯这种可视化的选择器,它还提供了Crontab表达式给你定义Period和Grace:

真乃神器啊!支持的通知方式如下:

国内用户可能一般只会用到Email和Teams,高级点的用户可能会用到IFTTT的Webhooks和普罗米修斯。总之,按你的爱好来就行。

本地开发

下面教大家如何在本地搭建这个项目:

1. 下载项目

https://github.com/healthchecks/healthchecks

如果你访问不了github,可在【Python 实用宝典】公众号后台回复 healthchecks 下载完整源代码

2.创建虚拟环境

推荐使用Python 3.6+,如果你有conda,那就非常方便了,创建healthchecks虚拟环境:

conda create -n healthchecks python=3.6
activate healthchecks

如果你没有conda,你需要先安装Python3.6,然后使用pip安装virtualenv,在终端输入以下命令创建healthchecks虚拟环境

python3 -m venv healthchecks
source healthchecks/bin/activate

不同系统中命令可能不太一样,遇到问题多利用搜索引擎查询就好了。

3.安装依赖

进入到上述创建好的虚拟环境后,cd进入项目根目录,输入以下命令安装依赖:

pip install -r requirements.txt

4.数据库配置(可选)

该项目默认使用SQLite,这意味着你不需要特殊配置也可照常运转。

如果你需要配置MySQL或PostgreSQL,请阅读hc/local_settings.py.example文件进行配置即可。

5.数据表迁移

Django项目当然少不了这个环节,虚拟环境下,在根目录里运行以下命令进行数据表的迁移:

python manage.py migrate

当然,还要创建超管用户:

python manage.py createsuperuser

6.运行项目

大功告成,输入以下命令即可运行项目:

python manage.py runserver

点击右上角login in登录到超管用户就可以开始使用了。

如果你需要对这个项目进行大规模的改动,建议使用Pycharm作为编程工具,因为使用Pycharm来写Django实在是太爽了,详细可以参考这篇文章:《Pycharm+Django 安装及配置指南》

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Brython!极具意义的Python前端开发工具

Python作为胶水语言,真的是无所不能。这不,最近又出现一个基于Python3,目标是替代JavaScript的前端开发工具—Brython.

好用吗?咱今天来试试用它写一个计算器有多简单:

不过,我们首先要知道它作为Python的客户端Web编程工具,和JS有什么区别呢?

1.特点

1.可轻易地在页面中内嵌Python终端进行测试

2.运行速度接近于CPyhon

3.写法方便,社区强大,可进行敏捷开发

我个人觉得相同的功能,用Python写起来可能会比JS快。

4.和JS一样,你不用安装任何东西就可以开始编写

下面就用Brython做一些简单的实验吧。

2.实验

1.在页面上显示 Hello !:

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script type="text/javascript"
        src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js">
    </script>
</head>

<body onload="brython()">

<script type="text/python">
from browser import document

document <= "Hello !"
</script>


</body>

</html>

将这份代码保存为index.html,双击在浏览器中打开,即可看到Hello !字样:

原理:

代码的head中,引入了一个Brython引擎附带的 brython.min.js 模块,用于使用Python控制页面。

而在<script type=”text/python”> 和</script>之间就是相应的Python代码。

可以看到,需要在document中显示文本,直接输入:

document <= “你所需要显示的文本”

即可,后续你将会看到用Brython使用标准化的DOM语法和页面交互的例子。

2.用HTML标签来做文本格式化:

如加粗文本:

from browser import document, html

document <= html.B("Hello !")

部分加粗、部分不加粗:

from browser import document, html

document <= html.B("Hello, ") + "world !"

I标签:

document <= html.UL(html.LI(i) for i in range(5))

超链接:

document <= html.A("Python实用宝典", href="https://pythondict.com")

全部例子如下:

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script type="text/javascript"
        src="https://cdn.jsdelivr.net/npm/brython@3.8.9/brython.min.js">
    </script>
</head>

<body onload="brython()">

<script type="text/python">
from browser import document, html

document <= html.B("Hello !")
document <= html.UL(html.LI(i) for i in range(5))
document <= html.A("Python实用宝典", href="https://pythondict.com")
</script>

</body>

</html>

效果:

3.写一个简单的计算器

先写好简单的图形架构,用th和tr标签即可:

from browser import document, html

calc = html.TABLE()
calc <= html.TR(html.TH(html.DIV("0", id="result"), colspan=3) +
                html.TH("C", id="clear"))
lines = ["789/",
         "456*",
         "123-",
         "0.=+"]

calc <= (html.TR(html.TD(x) for x in line) for line in lines)

document <= calc

然后加上一些css就可以把这个简单的图形架构变漂亮了:

<style>
*{
    font-family: sans-serif;
    font-weight: normal;
    font-size: 1.1em;
}
td{
    background-color: #ccc;
    padding: 10px 30px 10px 30px;
    border-radius: 0.2em;
    text-align: center;
    cursor: default;
}
#result{
    border-color: #000;
    border-width: 1px;
    border-style: solid;
    padding: 10px 30px 10px 30px;
    text-align: right;
}
</style>

最后只需要做运算符的事件触发器即可,从下面这行代码:

calc <= (html.TR(html.TD(x) for x in line) for line in lines)

可以看出,所有的按钮都被创建为td标签,因此我们要获得所有这些按钮是否被点击,仅需要:

for button in document.select("td"):
    button.bind("click", action)

意思是,按钮被点击后便执行 action 操作,action操作定义如下:

def action(event):
    """Handles the "click" event on a button of the calculator."""
    # The element the user clicked on is the attribute "target" of the
    # event object
    element = event.target
    # The text printed on the button is the element's "text" attribute
    value = element.text
    if value not in "=C":
        # update the result zone
        if result.text in ["0", "error"]:
            result.text = value
        else:
            result.text = result.text + value
    elif value == "C":
        # reset
        result.text = "0"
    elif value == "=":
        # execute the formula in result zone
        try:
            result.text = eval(result.text)
        except:
            result.text = "error"

如果不是=号或C号,则进行字符串拼接

如果是C号,则清空result。

如果是=号,则需要计算出结果,直接对字符串用eval()函数即可完成目的。

这边是全部核心代码了,写起来真的极其方便。

你可以在 https://pythondict.com/calculator.html 中体验一下这个计算器。

完整源代码可在Python实用宝典公众号后台回复 brython计算器 下载。

对了,编程时如果有遇到任何问题,都欢迎加群提问,千万不要嫌麻烦,对于你学习Python上的帮助可能是巨大的:

想加入Python互助群直面大佬?运行一行代码即可!

文章示例来自于 brython.info 有做部分修改。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

我们也有Python学习互助群啦!

最近问我问题的同学越来越多,平台越来越分散,很难进行管理,可能无意中漏了某些同学的问题,请见谅~

为了解决这个问题,我觉得还是搭建一个群,把大家都集中起来比较好。

这样做有几个好处:

一是交流容易、反馈容易,文章有问题大家可以直接@我,这样我就能进行快速的修改。

二是文章发布能被大家及时看到,现在我一般都在早上发布文章,文章有几率会被大家的公众号信息流覆盖掉。

三是更能帮助大家学习Python,有任何问题都能在群里问,我或者其他群友都会尽可能帮你。

四是沟通交流对于我们的学习非常重要,集思广益,各抒己见,人人都尽其所能,你知道我所不知道的,我知道你所不知道的,这样问题就变得容易解决。

群二维码:

另外,再提供一个微信个人号,有什么问题可以直接加我微信问我,有时间的话我会耐心解答的。

如果群二维码过期了,大家也可以直接加我微信,密我“进群”,然后我会拉你进群的。

最后,希望大家能开开心心学Python,学会用Python处理生活中的事~

Django-oscar 快速搭建商城网站

Django是一个相对容易学习的框架,并且已经发展了许多年,拥有相对活跃的开源环境。像豆瓣、Instagram,Spotify,YouTube等官方网站都是基于Django搭建的,今天我们来学着用它搭建一个商城网站。

Python实用宝典 曾经发表过Django的实战教程:

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

不过,这三篇文章是基于原生Django开发的。

今天我们来尝试使用他人搭建好的框架 Django-oscar,开发一个商城网站。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始第2步操作。

当然,我更推荐大家用VSCode编辑器,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

2.构建虚拟环境

为了防止不同环境下的Python包互相影响,在开始之前你应该先构建虚拟环境:

使用conda:

conda create -n mywebsite python=3.6

或使用virtualenv:

virtualenv --no-site-packages mywebsite 

如果是使用conda创建的虚拟环境,这样进入虚拟环境中:

Windows:

activate mywebsite 

Mac/Linux:

source activate mywebsite

使用virtualenv的话,一般虚拟环境会被安装到命令当前的目录下,使用以下方式进入虚拟环境:

Windows:

source mywebsite/scripts/activate

Mac/Linux:

source mywebsite/bin/activate 

最后,在终端输入以下命令安装我们所需要的依赖模块:

pip install django-oscar

看到 Successfully installed xxx 则说明安装成功,注意这里并不需要先安装Django, 因为Django-oscar中附有依赖的Django版本。

3.安装项目

成功安装依赖后,运行以下命令安装Django项目,我起名为easyshop:

django-admin startproject easyshop

然后进入项目中:

cd easyshop

编辑easyshop.easyshop.settings.py文件,将以下代码复制到settings.py的顶部

from oscar.defaults import *
from oscar import INSTALLED_APPS as OSCAR_APPS
# Path helper
location = lambda x: os.path.join(os.path.dirname(os.path.realpath(__file__)), x)

然后修改TEMPLATES变量以添加模板配置:

TEMPLATES = [
    {
        'BACKEND':'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            OSCAR_MAIN_TEMPLATE_DIR
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',
                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

然后在INSTALLED_APPS变量中添加:

django.contrib.sites
django.contrib.flatpages
widget_tweaks

并增加一个SITE_ID变量以便oscar框架识别:

# 此处可能会有重复,因此转化一遍
INSTALLED_APPS = list(set([
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'django.contrib.flatpages',
    'widget_tweaks',
] + OSCAR_APPS))

SITE_ID = 1

再添加两个中间件到中间件MIDDLEWARE变量:

'oscar.apps.basket.middleware.BasketMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',

最后添加身份验证和搜索引擎:

AUTHENTICATION_BACKENDS = (
    'oscar.apps.customer.auth_backends.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',
)
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
    },
}

4.项目运行

为了能正常访问oscar框架提供的后台,还需要配置一下 easyshop.easyshop.urls.py 文件:

from django.apps import apps
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(apps.get_app_config('oscar').urls[0])),
]

执行以下命令来运行项目:

python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

然后访问网址:http://127.0.0.1:8000/dashboard/

会出现一个用户登录框,输入刚createsuperuser时创建的超管用户即可:

进去后,就是网站的后台了:

这个框架给定的功能其实蛮全的,但对于我们中文站来说,你还需要做翻译,因为实质上该框架的国际化并不是很完善。

此外还需要补充微信支付和支付宝支付,这两个需要有商家权限才能开通。你可以从微信的官方SDK中导入相应代码,并结合到框架中。

总而言之,这是一个很不错的Django商城项目,有兴趣的话可以拿它来开发一个简单的商城。更多功能请关注官方文档:

https://django-oscar.readthedocs.io/en/latest/internals/getting_started.html

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python Django快速开发音乐高潮提取网(3)

上一次我们成功地完成了简单版的高潮音乐提取网站的开发,但是离上线还远远不够,今天我们将会把它完善到能上线的程度。全站已经上传到github上:

https://github.com/Ckend/yinyue30

你也可以在公众号后台回复: 音乐高潮提取网 下载。

1. 完善前端开发

在网上有这么多现成免费模板的情况下,单页面前端设计是非常简单的。我这里选用了 tooplate 的一套免费音乐模板,加上部分我需要的更改,并去掉了一些我所不需要的部分。

其实改动不大,不过大家要注意,在使用模板的时候,静态文件要保存到根目录下的static文件夹,然后将所有静态文件都放入里面:

除此之外,还需要再settings.py中设定以下参数:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
) 

在前端调用静态文件的时候,注意要这样调用:

<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> 

前端部分就不细讲了,能讲的东西不多,套套模板改点东西而已,大家可以找自己喜欢的模板来做,效果如下:

2.完善后端错误处理

这是我们在前一篇文章中提到的第二个改进点,那就是出现错误的时候没有提示,非常不友好,而且处理的时候也缺少提示正在处理中,很容易让人以为没有提交成功。

现在就让我们来解决这个缺点,首先要修改response,当用户提交的文件格式不正确,或文件大小超过我们的限制时,在渲染页面的时候要返回一个错误信息:

return render(request, 'index.html', {'form': form, 'wrong': "请上传正确的文件:wav/mp3格式, 大小不超过10M"}) 

前端接收信息时做一个判断,检查是否有wrong变量的存在,如果有则输出信息:

{%  if wrong %}
    <div class="alert alert-danger" style="text-align: center;" role="alert">{{ wrong }}</div>
{% endif %}  

效果如下:

另外一点,在处理提取音乐高潮部分的时候,用户会等待很长的时间,我们需要提示用户后端正在处理音乐,这个处理是纯前端代码就可以实现的,js部分:

   <script type="text/javascript">
    $(document).ready(function(){
      $('#file-upload').click(function(){
        $('#hidden').html('<div class="alert alert-info" role="alert">处理中, 完成后会自动下载,等待的时候要不...搜索关注一下 Python实用宝典 公众号</div>');
        $('#hidden').css('padding', '15px');
        $('#t_form').css('display', 'none');
      })
    });
  </script> 

在你想要显示这条信息的地方编写如下代码:

<div id="hidden"></div> 

即可实现该提示功能,效果如下:

3.网站上线

这一部分要注意,Django部署的时候需要uWSGI和Nginx一起使用,为什么不只用wsgi?因为它的性能不足以撑起大访问量,而且也不够安全。下面的教程需要你有一定的服务器经验,如果你不需要上线网站,那么下面的部分你并不需要阅读。

3.1 安装uwsgi

Ubuntu中输入以下命令安装uwsgi,centos将pip改成yum即可:

sudo pip install uwsgi –upgrade

安装时如果出现没有C编译器的情况请安装gcc编译器。然后输入以下命令运行项目:

uwsgi –http :8001 –chdir /path/to/project –module yinyue30.wsgi

–chdir是项目路径,yinyue30.wsgi是指项目里的wsgi文件。此外,可在命令前面加个nohup,让项目在后台运行:

nohup uwsgi –http :8001 –chdir /home/www/yinyue30 –module yinyue30.wsgi &

如果你希望以后能够自动化管理该进程,最好是安装supervisor,它能在进程挂掉的时候自动重拉进程,安装方法见:

https://code.ziqiangxuetang.com/django/django-nginx-deploy.html

3.2 配置Nginx

打开/etc/nginx/sites-available/default, 追加以下服务配置:

# mysite_nginx.conf

upstream django {
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

server {
    listen      8000;
    server_name example.com; # substitute your machine's IP address or FQDN
    charset     utf-8;

    client_max_body_size 75M;   # adjust to taste

    location /media  {
        alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /path/to/your/mysite/static; # your Django project's static files - amend as required
    }

    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
}

请根据需要修改成自己的配置。完成之后,输入service nginx reload,网站即可正常运行。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python Django快速开发音乐高潮提取网(2)

上次第一部分我们用Django搭建了一个简易的文件上传网站,今天让我们来完善这个网站,增加一些细节部分的调整,并加入音乐高潮提取的API.

如果你还没有阅读过第一部分,建议先从第一部分开始阅读哦:Python Django快速开发音乐高潮提取网(1)

本文完整源代码,请在后台回复:音乐高潮提取网 获取

1.文件校验

首先,为了安全起见,同时也为了减小服务器的压力,我们必须确认用户上传的文件是正确的。因此需要在views.py接收用户请求时,对用户上传的文件判断格式和大小。

在上篇文章中,我们使用了 forms 类生成表单,后端使用 request.FILES[‘docfile’] 获得了文件,这个对象具备什么属性呢?能不能让我们获得文件的大小和格式呢?

在一番搜索后,我终于找到了它的属性,这是一个叫做UploadedFile的类文件对象,具备以下属性:

详细文档:https://docs.djangoproject.com/en/3.0/ref/files/uploads/

通过size属性能获得bytes单位的文件大小,通过content_type可以获得文件属性,太好了,接下来就可以编写我们的校验代码:

这里我们限定了文件大小为10M (从bytes到MB的计算方法:1024*1024*10 ) ,上传文件的格式限定为wav和mp3. 将这个函数用于校验,如图所示:

好了,现在你再试一下上传图片,会发现什么反应都没有,上传mp3格式的音乐会返回上传成功的提示。

2.提取音乐的高潮部分

这一部分其实很简单,不过如果你还没看过音乐的高潮部分提取的文章,建议阅读:Python 音乐高潮提取

首先,引入我们所需要的包(安装方法在Python Django快速开发音乐高潮提取网(1)) :

from pychorus import find_and_output_chorus 

然后要拿到音乐文件的路径,才能过进行音乐提取,还记得我们在上节的教程中,其实是用了一个模型来上传文件的吗:

现在这个模型派上用场了。我们仅需要在文件对象保存之后,通过“对象.file.path ” 的属性就能获得文件的绝对路径。

ilePath = newdoc.file.path 

不过,我们还需要设定音乐高潮部分提取完成后的输出位置,我的设定方法是在同目录下保存一个后缀为_high的文件:

不过要注意的是,由于该模块用到了一个名为SoundFile的包,这个包在输出文件的时候仅支持以下格式,为了方便处理,我们默认输出格式为wav.

3.返回音乐高潮部分给用户

接下来要返回提取完成的音乐高潮部分的文件,我们希望将文件作为附件给用户下载,让用户自行选择软件播放音乐,而不是在网站上直接收听音乐。

Django能非常容易地实现这一点:

将文件以二进制的形式打开,然后作为HttpResponse返回,设定 content_type 和 Content_Disposition 即可。

好了,再次运行项目:python manage.py runserver 上传一个音乐试一下:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2019/12/2019121315094465.wav

这样,我们就能成功地完成用户上传——提取音乐高潮——返回用户下载的逻辑了。不过还有一些细节需要改进:

1.前端太丑了,能不能改进一下?
2.用户上传文件错误时没有提醒。
3.能不能多加点功能,比如其他用户的音乐分享?

下一次教程,我们就来完整地完成这个网站并上线!关注下方公众号,后台回复  音乐高潮提取网  获得本文全部源代码!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python Django快速开发音乐高潮提取网(1)

还记得我们上次做的一个高潮提取器吗:Python制作音乐高潮提取器。今天我们来把这个高潮提取器做成一个网站,让许多不懂技术的人也可以很方便地提取歌曲里的高潮/副歌部分。

其实这是一个非常简单的单页面网站,不需要数据、不需要celery、不需要各种高深的后端技术。不过,如果适当地利用一些Python的Web开发框架,我们能更快地完成这个网站的开发,也能够顺便带大家入门一下Web开发框架。

因此我们将用Django来完成这个网站。不过由于我不想让文章篇幅变得冗长,我们将分为两部分来讲解,第一部分是建造一个简单的支持文件上传的网站,第二部分将基于第一部分完善文件上传功能,建造一个音乐高潮提取网。

1.准备

在开始之前,你需要先安装好Python,如果还没有安装Python,请看这篇文章:超详细安装Python指南

打开CMD(windows)/Terminal(macos),下文统一称这两者为终端,输入安装Django的命令:

pip install Django

看到终端结果显示类似如下则说明安装成功。

安装高潮提取器需要用到的项目:

pip install pychorus

2.新建Django项目

在你希望放置项目文件的目录下打开终端,输入以下命令:

django-admin startproject yinyue30

如果遇到 未找到命令 Django-admin 这样的错误,则说明你需要配置Django的环境变量,详细可以看这篇文章的windows Django安装:

https://www.runoob.com/django/django-install.html

这个命令会新建一个Django项目,目录结构如下:

3.Django应用开发

新建了Django项目后,我们就可以开始应用开发了。使用终端在生成的yinyue30文件夹中,输入以下命令新建“extractor(提取器)”应用:

python manage.py startapp extractor

到这里,应用初始化就算正式完成了。让我们看一下现在的文件结构:

看起来有点复杂,但是不要紧,我们只需要管其中几个文件即可。在我们开始正式编写代码前,我想先解释一下Django的设计模式。

3.1 Django设计模式简析( 你可以跳过这一部分)

传统的网站设计模型是MVC模型,即:

M 代表模型(Model):负责对象和数据的关系(ORM)。
V 代表视图 (View):负责如何把页面展示给用户(html)。
C 代表控制器(Controller):负责转发请求,处理请求等。

实质上Django也是类似的模型,不过有些许不同。Django更像是一个MVT模型,其中Controller的功能,被分担到了View和url转发器中。

在今天的教程中,我们重点关注的对象是View和Url转发器。

3.3 模型设计—编写models.py

尽管我们这个单页面应用可以不用到模型,但是使用模型能够帮助我们简化不少流程。而且代码非常简单:

文件将会被上传到“media/当前日期/ ” 的文件夹下,而且是和manage.py同级。如图所示:

之所以用Django自带的文件模型,不仅仅是因为这点方便,它还支持文件同名处理,当两个用户上传了相同文件名的文件时,第二个文件会被加一串md5作为区别。

除此之外,它还能限定文件上传的大小,具备用API作为代理访问基础文件等诸多方便的功能,如果你想了解更多的细节,可以阅读官方文档: https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/

3.4 视图设计—编写views.py

在views.py我们主要做以下几个事情:

1.渲染前端页面,允许用户提交文件。
2.获得用户请求时发送的文件。
3.对用户请求的文件进行音乐高潮提取。
4.提取完后返回音乐的高潮部分给用户。

其中,后端要校验文件大小(前端校验的话容易被绕过),然后提取音乐高潮的时候前端应该有“处理中 ” 的提示,等待提取完成返回结果后,前端直接显示下载按钮。

我们先来制作允许用户提交文件这一部分。

3.4.1 编写forms表单

Django有个我特别喜欢的特性:通过Form类能生成HTML代码,如果是做简单的页面开发,不需要用到前后端分离的情况下, 这点实在非常方便:

在extractor文件夹下新建一个forms.py的文件,写入以下代码:

接下来,在在extractor文件夹下新建templates文件夹,并在里面新建一个index.html 编写前端代码,将表单引入进来:

可以注意到,我们直接将表单以 {{ form.docfile }} 的形式引入进来生成前端表单,与此同时, {{ form.docfile.label_tag }} 可以直接将我们在类中定义的属性引入进前端。还有一点需要注意的是 {% csrf_token %},这是在Django表单中必带的,它会在请求中注入一段token,以防止跨站攻击。

3.4.2 编写views主逻辑

接下来,我们就来编写views的主逻辑,让它接受文件上传的POST请求并渲染前端页面:

它主要做这么几件事:

一是判断这个请求是否为POST请求,若是POST请求则进入文件上传保存的逻辑,判断用户上传的表单是否符合要求,若符合要求则保存文档,并返回HTTP回应:“上传成功!”。

二、如果不是POST请求,则说明是普通的访问,那么将生成一个空表单,渲染这个表单页面到前端,供用户提交文档。

3.5 配置路由

准备就绪了,接下来只要让我们把路由接上、再做一点简单的配置就能成功启动应用:

在extractor下新建一个urls.py文件,它将存放extractor即我们的提取器应用的所有路由(尽管我们就一个页面),配置如下:

它将能将直接访问域名的请求转发到views中的index函数,也就是我们刚在views.py中编写的主逻辑。不过这个是应用的路由,我们还需要修改Django项目的主路由:

将yinyue30文件夹下的 urls.py 修改如下:

这里需要在Django中引入include函数,然后在urlpatterns中,将所有直接指向域名的请求转发给我们刚刚编写的extractor的路由(extractor/urls.py),这样就大功告成了!

3.6 配置和迁移

我们刚刚编写了一个简单的extractor应用,由于Django对APP是有着即插即用的特点,因此我们需要将这个应用“插入”到Django中。

插入的方法也很简单,打开yinyue30文件夹下的settings.py, 在 INSTALLED_APPS 数组中加入 ‘extractor.apps.ExtractorConfig’ 。

最后一步,Django中有许多自带功能需要用到数据和表,还有我们刚刚新建的文件模型也需要用到数据,因此得新建我们所需要的东西,所幸,Django本身自带了迁移功能,而且默认使用的是sqlite,这方便了我们这个简单应用的开发,因为我们甚至不需要去配置mysql,直接迁移。

在根目录(与manage.py同级)运行以下命令即可迁移完成:
python manage.py makemigrations
python manage.py migrate

第一句是生成迁移表,其实就是一些sql语句组成的文件。第二句是执行sql操作,即完成迁移功能。

4. 运行项目

接下来我们就能让项目跑起来了, 在根目录(与manage.py同级)运行以下命令运行程序:

python manage.py runserver

运行后访问http://127.0.0.1:8000效果如下:

尝试上传, 上传成功 :

顺便检查下是否真的传入,发现有文件在media下,放心了:

那么我们第一部分的任务就算顺利完成了!下一部分,我们将正式将音乐高潮提取器的部分加上去。 敬请期待! 关注下方公众号,后台回复 音乐高潮提取网 获得项目第一部分源代码!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典