聚学在线

http://coding.imooc.com/class/evaluation/368.html


  • 首页

  • 所有文章

  • 分类

  • 慕学在线网

  • 搜索
close

centos7下搭建sentry错误日志服务器

发表于 2019-12-11   |   分类于 django   |     |   阅读次数

本文主要介绍在centos7 下通过docker安装sentry

1. 安装docker

参考:
    https://linoxide.com/containers/upgrade-docker-fedora-centos/

1. 卸载已有的docker 

    yum remove docker docker-common docker-selinux docker-engine

1. 安装docker的依赖

    yum install -y yum-utils device-mapper-persistent-data lvm2

3. 安装docker-ce
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    yum install docker-ce

2. 启动docker后台服务

    service docker start

3. 测试运行

    docker run hello-world

4. 设置开机启动

    sudo systemctl enable docker

2. 安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

测试

docker-compose version

3. 安装sentry

1. 安装git 
    yum install git
2. 下载onpremise

    git clone https://github.com/getsentry/onpremise.git
3. 安装
    cd onpremise

    ./install.sh

4. 启动

    docker-compose up -d

5. 创建账号

    docker-compose run --rm web createuser

4. 各种问题

https://www.cnblogs.com/Shadow3627/p/10767023.html

最后在浏览器中访问 http://localhost:9000/

注意启动顺序 woker->cron->web, 如果不启动worker和cron可能会遇到报错如下:

centos7 下通过nginx+uwsgi部署django应用

发表于 2019-11-15   |   分类于 django , 慕学在线网 , 生鲜电商   |     |   阅读次数
1. 安装python3.6
提前安装好系统依赖包:
   centos: 
    yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++  openssl-devel libffi-devel python-devel mariadb-devel
ubuntu:
   sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev default-libmysqlclient-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev

1. 获取

wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
tar -xzvf Python-3.6.2.tgz -C  /tmp
cd  /tmp/Python-3.6.2/

2. 把Python3.6安装到 /usr/local 目录

./configure --prefix=/usr/local
make
make altinstall

3. 更改/usr/bin/python链接

ln -s /usr/local/bin/python3.6 /usr/bin/python3
2. maridb
1. 安装

    sudo yum install mariadb-server
2. 启动, 重启

    sudo systemctl start mariadb
    sudo systemctl restart mariadb

3. 设置bind-ip

    vim /etc/my.cnf
    在 [mysqld]:
        下面加一行
        bind-address = 0.0.0.0

4. 设置外部ip可以访问

    先进入mysql才能运行下面命令:
        mysql 直接进入就行

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

    FLUSH PRIVILEGES

5. 设置阿里云的对外端口

   视频中有讲解这部分

6. 安装mysqlclient出问题

    centos 7:
        yum install python-devel mariadb-devel -y

    ubuntu:
        sudo apt-get install libmysqlclient-dev

    然后:
        pip install mysqlclient
3. 安装nginx
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
4. 安装virtualenvwrapper
yum install python-setuptools python-devel
pip install virtualenvwrapper
编辑.bashrc文件
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
重新加载.bashrc文件
source  ~/.bashrc
新建虚拟环境
mkvirtualenv mxonline
进入虚拟环境 
workon mxonline
安装pip包
我们可以通过 pip freeze > requirements.txt 将本地的虚拟环境安装包相信信息导出来

然后将requirements.txt文件上传到服务器之后运行:

pip install -r requirements.txt
安装依赖包
5. 安装uwsgi
pip install uwsgi
6. 测试uwsgi
uwsgi --http :8000 --module MxOnline.wsgi
7. 配置nginx
新建uc_nginx.conf


# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server

server {
# the port your site will be served on
listen      80;
# the domain name it will serve for
server_name 你的ip地址 ; # substitute your machine's IP address or FQDN
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste

# Django media
location /media  {
    alias 你的目录/Mxonline/media;  # 指向django的media目录
}

location /static {
    alias 你的目录/Mxonline/static; # 指向django的static目录
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  django;
    include     uwsgi_params; # the uwsgi_params file you installed
}
}
8. 将该配置文件加入到nginx的启动配置文件中
sudo ln -s 你的目录/Mxonline/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
8. 拉取所有需要的static file 到同一个目录
在django的setting文件中,添加下面一行内容:

    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
运行命令
    python manage.py collectstatic
9. 运行nginx
sudo /usr/sbin/nginx

这里需要注意 一定是直接用nginx命令启动, 不要用systemctl启动nginx不然会有权限问题

10. 通过配置文件启动uwsgi
新建uwsgi.ini 配置文件, 内容如下:

    # mysite_uwsgi.ini file
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    chdir           = /home/bobby/Projects/MxOnline
    # Django's wsgi file
    module          = MxOnline.wsgi
    # the virtualenv (full path)

    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 10
    # the socket (use the full path to be safe
    socket          = 127.0.0.1:8000
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
    virtualenv = /home/bobby/.virtualenvs/mxonline

    logto = /tmp/mylog.log

注:
    chdir: 表示需要操作的目录,也就是项目的目录
    module: wsgi文件的路径
    processes: 进程数
    virtualenv:虚拟环境的目录


workon mxonline
uwsgi -i 你的目录/Mxonline/conf/uwsgi.ini &
访问
http://你的ip地址/

xadmin所有可以设置的功能

发表于 2019-10-21   |     |   阅读次数

http://coding.imooc.com/class/368.html

ubuntu下安装pillow失败

发表于 2019-10-21   |     |   阅读次数

ubuntu 16.04下
运行命令

pip install pillow

然后失败了:

解决办法,先安装:

sudo apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev

然后重新运行

pip install pillow

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

linux下安装mysql-python出错

发表于 2019-10-20   |     |   阅读次数

命令

pip install mysql-python

然后出错了:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/pip-build-YEYPJp/mysql-python/setup.py", line 17, in <module>
    metadata, options = get_config()
  File "setup_posix.py", line 43, in get_config
    libs = mysql_config("libs_r")
  File "setup_posix.py", line 25, in mysql_config
    raise EnvironmentError("%s not found" % (mysql_config.path,))
EnvironmentError: mysql_config not found

解决方法:

sudo apt-get install libmysqlclient-dev

然后重新安装就ok了

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

django从请求到返回都经历了什么

发表于 2019-10-17   |     |   阅读次数
从runserver说起
ruserver是使用django自己的web server,主要用于开发和调试中, 部署到线上环境一般使用nginx+uwsgi模式
manage.py 探秘
看一下manager.py的源码,你会发现上面的命令其实是通过Django的execute_from_command_line方法执行了内部实现的runserver命令,那么现在看一下runserver具体做了什么。。
通过源码分析可知, ruserserver主要完成两件事:

1). 解析参数,并通过django.core.servers.basehttp.get_internal_wsgi_application方法获取wsgi handler;
2). 根据ip_address和port生成一个WSGIServer对象,接受用户请求

get_internal_wsgi_application的源码如下:

image

通过上面的代码我们可以知道,Django会先根据settings中的WSGI_APPLICATION来获取handler;
在创建project的时候,Django会默认创建一个wsgi.py文件,而settings中的WSGI_APPLICATION配置也会默认指向这个文件。看一下这个wsgi.py文件,其实它也和上面的逻辑一样,最终调用get_wsgi_application实现。
django http请求处理流程
Django和其他Web框架一样,HTTP的处理流程基本类似:接受request,返回response内容。Django的具体处理流程大致如下:
1. 加载settings.py
在通过django-admin.py创建project的时候,Django会自动生成默认的settings文件和manager.py等文件,在创建WSGIServer之前会执行下面的引用:

from django.conf import settings

上面引用在执行时,会读取os.environ中的DJANGO_SETTINGS_MODULE配置,加载项目配置文件,生成settings对象。所以,在manager.py文件中你可以看到,在获取WSGIServer之前,会先将project的settings路径加到os路径中。
2. 创建WSGIServer
不管是使用runserver还是uWSGI运行Django项目,在启动时都会调用django.core.servers.basehttp中的run()方法
创建一个django.core.servers.basehttp.WSGIServer类的实例,之后调用其serve_forever()方法启动HTTP服务。run方法的源码如下:

def run(addr, port, wsgi_handler, ipv6=False, threading=False):
    server_address = (addr, port)
    if threading:
        httpd_cls = type(str('WSGIServer'), (socketserver.ThreadingMixIn, WSGIServer), {})
    else:
        httpd_cls = WSGIServer
    httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)
    if threading:
        # ThreadingMixIn.daemon_threads indicates how threads will behave on an
        # abrupt shutdown; like quitting the server by the user or restarting
        # by the auto-reloader. True means the server will not wait for thread
        # termination before it quits. This will make auto-reloader faster
        # and will prevent the need to kill the server manually if a thread
        # isn't terminating correctly.
        httpd.daemon_threads = True
    httpd.set_app(wsgi_handler)
    httpd.serve_forever()

如上,我们可以看到:在创建WSGIServer实例的时候会指定HTTP请求的Handler,
上述代码使用WSGIRequestHandler。当用户的HTTP请求到达服务器时,
WSGIServer会创建WSGIRequestHandler实例,使用其handler方法来处理HTTP请求(其实最终是调用wsgiref.handlers.BaseHandler中的run方法处理)。
WSGIServer通过set_app方法设置一个可调用(callable)的对象作为application,上面提到的handler方法最终会调用设置的application处理request,并返回response。

其中,WSGIServer继承自wsgiref.simple_server.WSGIServer,而WSGIRequestHandler继承自wsgiref.simple_server.WSGIRequestHandler,wsgiref是Python标准库给出的WSGI的参考实现。其源码可自行到wsgiref参看,这里不再细说。
3. 处理Request
第二步中说到的application,在Django中一般是django.core.handlers.wsgi.WSGIHandler对象,WSGIHandler继承自django.core.handlers.base.BaseHandler,这个是Django处理request的核心逻辑,它会创建一个WSGIRequest实例,而WSGIRequest是从http.HttpRequest继承而来
4. 返回Response
上面提到的BaseHandler中有个get_response方法,该方法会先加载Django项目的ROOT_URLCONF,然后根据url规则找到对应的view方法(类),view逻辑会根据request实例生成并返回具体的response。

在Django返回结果之后,第二步中提到wsgiref.handlers.BaseHandler.run方法会调用finish_response结束请求,并将内容返回给用户
Django处理Request的详细流程
首先给大家分享两个网上看到的Django流程图:

mark
流程图一

image
流程图二

上面的两张流程图可以大致描述Django处理request的流程,按照流程图2的标注,可以分为以下几个步骤:

1. 用户通过浏览器请求一个页面

2.请求到达Request Middlewares,中间件对request做一些预处理或者直接response请求
3.URLConf通过urls.py文件和请求的URL找到相应的View
4.View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
5.调用View中的函数
6.View中的方法可以选择性的通过Models访问底层的数据
7.所有的Model-to-DB的交互都是通过manager完成的
8.如果需要,Views可以使用一个特殊的Context
9.Context被传给Template用来生成页面
    a.Template使用Filters和Tags去渲染输出
    b.输出被返回到View
    c.HTTPResponse被发送到Response Middlewares
    d.任何Response Middlewares都可以丰富response或者返回一个完全不同的response
    e.Response返回到浏览器,呈现给用户

上述流程中最主要的几个部分分别是:Middleware(中间件,包括request, view, exception, response),URLConf(url映射关系),Template(模板系统),下面一一介绍一下。
1. Middleware(中间件)
Middleware并不是Django所独有的东西,在其他的Web框架中也有这种概念。在Django中,Middleware可以渗入处理流程的四个阶段:request,view,response和exception,相应的,在每个Middleware类中都有rocess_request,process_view, process_response 和 process_exception这四个方法。你可以定义其中任意一个活多个方法,这取决于你希望该Middleware作用于哪个处理阶段。每个方法都可以直接返回response对象。

Middleware是在Django BaseHandler的load_middleware方法执行时加载的,加载之后会建立四个列表作为处理器的实例变量:

_request_middleware:process_request方法的列表

_view_middleware:process_view方法的列表

_response_middleware:process_response方法的列表

_exception_middleware:process_exception方法的列表

Django的中间件是在其配置文件(settings.py)的MIDDLEWARE_CLASSES元组中定义的。在MIDDLEWARE_CLASSES中,中间件组件用字符串表示:指向中间件类名的完整Python路径。例如

`MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]`

Django项目的安装并不强制要求任何中间件,如果你愿意,MIDDLEWARE_CLASSES可以为空。中间件出现的顺序非常重要:在request和view的处理阶段,Django按照MIDDLEWARE_CLASSES中出现的顺序来应用中间件,而在response和exception异常处理阶段,Django则按逆序来调用它们。也就是说,Django将MIDDLEWARE_CLASSES视为view函数外层的顺序包装子:在request阶段按顺序从上到下穿过,而在response则反过来。以下这张图可以更好地帮助你理解:

image

  1. URLConf(URL映射)
如果处理request的中间件都没有直接返回response,那么Django会去解析用户请求的URL。URLconf就是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。通过这种方式可以告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。具体的,在Django项目的配置文件中有ROOT_URLCONF常量,这个常量加上根目录"/",作为参数来创建django.core.urlresolvers.RegexURLResolver的实例,然后通过它的resolve方法解析用户请求的URL,找到第一个匹配的view。

有关urlconf的内容,大家可以参考 [理解curlConf]()
  1. Template(模板)
大部分web框架都有自己的Template(模板)系统,Django也是。但是,Django模板不同于Mako模板和jinja2模板,在Django模板不能直接写Python代码,只能通过额外的定义filter和template tag实现。由于本文主要介绍Django流程,模板内容就不过多介绍。

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

windows下搭建virtualenv、virtualenvwrapper虚拟环境

发表于 2019-10-17   |     |   阅读次数

操作系统: win7

virtualenv

1. 安装virtualenv
pip install virtualenv

image

2. 新建虚拟环境
virtualenv bobbyvir

image

注: 1. 虚拟环境位于当前命令的目录下 这里是 E:\Projects\projectsedu.com
     2. 虚拟环境名称为 bobbyvir
3. 进入虚拟环境
1) 进入虚拟环境目录: cd E:\Projects\projectsedu.com
2) 进入脚本目录:     cd bobbyvir\Scripts
2) 运行activate.bat:  activate.bat

image

查看虚拟环境中默认安装的库

pip list

image

4. 虚拟环境下安装开发库, 这里以requests库为参考
pip install request

image

5. 退出virtualenv
deactivate.bat

image

virtualenvwrapper

上面每次进入virtual我们都需要进入到virtualenv的目录下,一旦virtualenv过多,就蛋疼了,接下来隆重推荐virtualenvwrapper

1. 安装virtualenvwrapper
pip install virtualenvwrapper-win
注: linux下运行pip install virtualenvwrapper

image

设置WORK_HOME环境变量

mark

2. 新建虚拟环境
mkvirtualenv bobbyvir

mark

注:因为前一步设置了WORK_HOME,所有虚拟环境将安装到 E:\virtualevn
3. 查看安装的所有虚拟环境
workon

mark

注: 这里不能查看到有virtualenv创建的虚拟环境,只能查看mkvirtualenv创建的虚拟环境
4. 进入虚拟环境
workon bobbyvir

mark

5. 退出虚拟环境
deactivate

mark

小伙伴有没有觉得so easy

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

windows下mysql-python安装出错

发表于 2019-10-17   |     |   阅读次数

windows安装python的mysql驱动是so easy的:

pip install mysql-python

但是毫不意外的出错了:

_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory
酱紫的:

image

一般安装运行上面的神器命令都会出错,即使在linux下也是, 直接上解决办法:

到 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载二进制安装包
网站打开大概是酱紫的:

image

通过ctrl+f 搜索 “mysql-python”, 然后就酱紫了:

image

下载64位版本

然后运行安装:pip install MySQL_python-1.2.5-cp27-none-win_amd64.whl

然后稍等一下

image

oh yeah, 成功啦, 我门就可以快速的开始我门下一步的开发工作了

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

sqlalchemy批量插入的坑

发表于 2019-10-14   |     |   阅读次数

默认提供的bulk_save_objects是在一次事务中提交多次save

需求:一个sql语句插入多个实体
直接上代码

models.py

from sqlalchemy import (Column, String, DateTime, UnicodeText, BigInteger, Boolean, Integer, Text, Float)
from sqlalchemy import TypeDecorator
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class People(Base):
    """
    people类
    """
    __tablename__ = 'people'

    id = Column(Integer, primary_key=True, unique=True, index=True, autoincrement=False)
    name = Column(String(100))
    age = Column(Integer, default=0)
    add_time = Column(DateTime, default=datetime.now, nullable=False)

#注意 sqlalchemy字段默认可以为空,和django model相反

views.py

value_list = []
dict_list = []

people1 = People()
people2 = People()

value_list.append(people1)
value_list.append(people2)

for item in value_list:
    item_dict = item.__dict__
    if "_sa_instance_state" in item_dict:
        del item_dict["_sa_instance_state"]
        dict_list.append(item_dict)


engine = create_engine('mssql+pymssql://user:password@127.0.0.1:1433/data')
DBSession = sessionmaker(bind=engine)
session = TWDBSession()
session.execute(timeline.__table__.insert(dict_list))
session.commit()


这里有个巨大的坑,如果people中任何一个实体没有某个字段,则即使其他实体有该字段也无法将该值插入到数据库中, 如下代码:

people1 = People()

people1.name = "bobby1"

people2 = People()

people2.name = "bobby1"
people2.age = 3

#注意people1没有设置age字段, 则在批量插入的时候, people1和people2都在数据库中都没有age字段。
解决办法:  
    加上people1.age = None

具体原因还没有看源码,以后有时间再研究

最后欢迎大家观看我关于 django + xadmin的教程:

http://coding.imooc.com/class/evaluation/368.html

django通过celery添加异步任务

发表于 2017-02-08   |     |   阅读次数

异步任务的重要性

大家在做web项目的时候经常会遇到一些耗时的操作, 比如: 发送邮件、发送短信、生成pdf。这些操作在某些情况下需要立即返回结果给用户,但是可以在后台异步执行。

比如用户邮箱注册的时候, 在发送邮件的时候可以先把”已经发送激活邮件到邮箱”返回给用户, 同时把邮件发送任务提交到异步处理线程中。

现在介绍一款python写的专门用于处理异步任务的框架–celery。当然celery能完成的功能远不止异步任务, 还有一个很常用的功能–定时任务

celery的功能还包括:定义工作流、监控、任务流控制、资源泄露保护以及自定义用户组件等。

celery介绍

说明:
    最新版本的celery支持的python版本必须大于2.7.6,
    如果是python2.7.6及以下版本的时候import celery是会报错滴。

celery是通过将代码序列然后传输到中间通信组件,这些组件可以采用任何方式实现, 这里最常用的两种是rabbitmq和redis, 然后celery的后台线程不停的从rabbitmq或者redis中读取这些任务并执行然后返回结果到这些组件,这样就实现了一个异步的功能。

Celery 用redis或者rabbitmq做消息通信,这里redis或者rabbitmq被称为中间人(Broker)Celery 系统可包含多个线程和中间人,以此获得高可用性和横向扩展能力。

Celery 虽然是用 Python 编写的,但协议可以用任何语言实现。迄今,已有 Ruby 实现的 RCelery 、node.js 实现的 node-celery 以及一个 PHP 客户端 ,语言互通也可以通过 using webhooks 实现。

django 介绍

django作为python最主流也是资格最老的的web开发系统,是一个全栈的开发框架,几乎web开发系统中会用到的所有功能django都有,即使没有也可以在网站找到对应的开源解决方案,在stackoverflow上的问答也是最多的。基本上学习懂了django以后学习其他如flask、tornado都会觉得手到擒来。

本文中我们就介绍一下如何将celery集成到django中来完成django耗时任务的异步执行和定时任务计划。

我们将采用redis来做为中间人

###celery 安装和使用

celery安装

pip install -U celery[redis]

该命令会安装celery以及redis开发相关所有的依赖包。安装完成我们可以看到:
image
这里我们可以看到安装了billiard、pytz、vine、amqp、redis、celery等

redis-server安装

既然是用redis做中间人,当然需要安装redis了、我们直接运行:

sudo apt-getin install redis-server

运行成功以后可以,redis-server直接就作为服务启动了, 我们可以通过:

ps aux|grep redis

命令来查看redis是否启动如下图:
image

这里我们可以看到redis已经在6379端口监听了

启动celery的worker

前面介绍了celery的处理流程, 既然我们已经启动了redis, 当然我们需要启动一个随时监听异步处理函数的worker了。 这里我们直接启动celery的worker就行了

首先我们来新建一个tasks.py 文件, 内容如下:

from celery import Celery

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

@app.task
def hello():
    return 'hello world'

然后我们允许下面的命令启动celery的worker

celery -A tasks worker --loglevel=info

注:

这里tasks表示的是上面创建的文件的名字, 比如如果我们的py文件为tasks.py, 则直接 celery -A tasks worker --loglevel=info。 如果我们的py文件为celery-tasks这命令应该修改为:
celery -A celery-tasks worker --loglevel=info

启动后我们就可以看到celery已经启动了线程时刻监听redis中的异步函数,如下:
image

接下来我们分析一下上面的tasks.py文件:

    1. 首先直接初始化Celery对象, 并指明使用的redis的连接地址
    2. 直接用celery对象的task装饰任何我们需要异步的函数
简单两步就完成了celery的异步函数

直接执行异步函数

这一步里面我们直接新建test.py文件, 内容如下:

from tasks import add

add.delay(1,2)

注意这里对add函数的调用采用的是delay函数而不是直接采用add(1,2),因为这样调用就和普通函数调用没有区别了。所以这里一定要注意。运行test.py文件后我们可以看到celery的输出:

image

在最后面我们可以清楚的看到调用了add函数, add函数的执行结果会返回到redis中
这里delay函数是将函数执行异步放入到redis中交给celery执行, 这样delay之后就会有个问题就是如果我们需要理解得到结果怎么办呢?

我们可以直接调用:

add.delay(1,2).get()

这样就变成同步的了,等到返回结果才会去执行下一步

celery添加异步任务

celery的使用非常简单

这里我们可以看到需要将一个函数变为异步函数非常简单, 只需要添加@app.task装饰器就够了。 是不是非常简单啊。

  1. 配置celery连接redis

    app.conf.result_backend = ‘redis://localhost:6379/0’

  2. 配置任务执行结果保存地址

    app.conf.result_backend = ‘redis://localhost:6379/0’

    前面我们讲到过celery是从中间人取出函数并执行,但是保存结果也需要保存到中间人, 这里实际上取任务的地方和保存结果的中间人实际上可以不一样, 所有这里就提供了中间结果执行的保存地址

集成celery到django中

这里以我的一门django搭建在线教育平台的课程为例来讲解,大家如果有兴趣可以去关注一下,课程强力django+杀手级xadmin

首先我们来看一下完整的系统结构图:
image

1.修改django项目的MxOnline/settings.py文件, 加上:

###配置Broker
BROKER_URL = 'redis://127.0.0.1:6379/0'
BROKER_TRANSPORT = 'redis'

2.在MxOline下面新建celery.py文件

from __future__ import absolute_import

import os
import django

from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MxOnline.settings')
django.setup()

app = Celery('MxOnline')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

结构如图所示:

image

3.在对应的app下面新建tasks.py文件, 这里我们在users这个app下面新建, 如图所示:

image

文件源码如下:

from MxOnline.celery import app

@app.task
def send_register_email(email, send_type="register"):
    email_record = EmailVerifyRecord()
    if send_type == "update_email":
        code = random_str(4)
    else:
        code = random_str(16)
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.save()

    email_title = ""
    email_body = ""

    if send_type == "register":
        email_title = "慕学在线网注册激活链接"
        email_body = "请点击下面的链接激活你的账号: http://www.imooc.com/active/{0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass
    elif send_type == "forget":
        email_title = "慕学在线网注册密码重置链接"
        email_body = "请点击下面的链接重置密码: http://www.imooc.com/reset/{0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass
    elif send_type == "update_email":
        email_title = "慕学在线邮箱修改验证码"
        email_body = "你的邮箱验证码为: {0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass

4. 编辑views.py文件完成邮件发送异步调用:

    #coding:utf-8
    from django.shortcuts import render
    from django.http import HttpResponse

    from .tasks import send_register_email

    def index(request):
        send_register_email.delay()
        return HttpResponse(u"邮件发送成功, 请查收")

5. 进入MxOnline目录运行:
    celery -A demo worker -l debug

    以此来启动celery的worker服务

关于django是如何实现邮件发送以及如何配置邮件的发送方配置,在课程强力django+杀手级xadmin中我会详细讲解,另外,课程中还会讲解django实现cookie和session的登录原理,当然django的强大绝不止于此,尤其是结合xadmin,你几乎可以做到以最快的速度搭建完整的前后台,如果你想全面掌握django,谋求一份python web 开发的工作,那就跟我一起来做一次实战:用django开发一个完整的在线教育网站,在实战中学习是掌握技术的捷径,你不仅会理解真实开发与纯理论的差别,更会了解如何避免开发中的“坑”,同时,这套完整的在线教育网站的全套代码都会开放给你,你甚至可以直接拿来用在工作中,所以如果这些是你想要的,那么我在慕课网等着你

至此,大功告成了!我们可以在我们定义的任何apps中添加tasks来定义需要的异步任务。

12
bobbyli

bobbyli

http://coding.imooc.com/class/evaluation/368.html

14 日志
3 分类
9 标签
RSS
GitHub 微博
Links
  • 聚学在线
© 2021 bobbyli 蜀ICP备16029565号-1