From 57bcc5ebc14a66913d3d8b5078f751c2403737e3 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Sun, 10 Nov 2013 20:00:33 -0200 Subject: [PATCH 01/12] Add uf route #56 --- PostmonServer.py | 11 +++++++++++ database.py | 3 +++ 2 files changed, 14 insertions(+) diff --git a/PostmonServer.py b/PostmonServer.py index 5b49ef4..c1d5108 100644 --- a/PostmonServer.py +++ b/PostmonServer.py @@ -85,6 +85,17 @@ def verifica_cep(cep): 'localizado' % cep return +@app_v1.route('/uf/') +def uf(sigla): + sigla = sigla.lower() + db = Database() + result = db.get_one_uf(sigla, fields={'_id': False}) + if result: + response.headers['Cache-Control'] = 'public, max-age=2592000' + return format_result(result) + else: + response.status = '404 A sigla %s informada nao pode ser localizada'.format(sigla) + return @app_v1.route('/rastreio//') def track_pack(provider, track): diff --git a/database.py b/database.py index 9d12882..b7b98ea 100644 --- a/database.py +++ b/database.py @@ -25,6 +25,9 @@ def __init__(self, address='localhost'): def get_one(self, cep, **kwargs): return self._db.ceps.find_one({'cep': cep}, **kwargs) + def get_one_uf(self, sigla, **kwargs): + return self._db.ufs.find_one({'sigla': sigla}, **kwargs) + def insert_or_update(self, obj, **kwargs): update = {'$set': obj} From 574e00c2f1658d4ab2e06f46517e80906ec74e7f Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Sun, 10 Nov 2013 20:30:17 -0200 Subject: [PATCH 02/12] Add estado_info attr into cep route return obj #56 --- PostmonServer.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/PostmonServer.py b/PostmonServer.py index c1d5108..e2afbd9 100644 --- a/PostmonServer.py +++ b/PostmonServer.py @@ -53,6 +53,11 @@ def format_result(result): return result +def _get_estado_info(db, sigla): + sigla = sigla.lower() + return db.get_one_uf(sigla, fields={'_id': False, 'sigla': False}) + + @route('/cep/') @app_v1.route('/cep/') def verifica_cep(cep): @@ -79,24 +84,31 @@ def verifica_cep(cep): if result: response.headers['Cache-Control'] = 'public, max-age=2592000' + estado_info = _get_estado_info(db, result['estado']) + if estado_info: + result['estado_info'] = estado_info return format_result(result) else: response.status = '404 O CEP %s informado nao pode ser ' 'localizado' % cep return + @app_v1.route('/uf/') def uf(sigla): - sigla = sigla.lower() db = Database() - result = db.get_one_uf(sigla, fields={'_id': False}) + result = _get_estado_info(db, sigla) if result: response.headers['Cache-Control'] = 'public, max-age=2592000' return format_result(result) else: - response.status = '404 A sigla %s informada nao pode ser localizada'.format(sigla) + message = '404 A sigla %s informada ' \ + 'nao pode ser localizada' + response.status = message % sigla + print response.status return + @app_v1.route('/rastreio//') def track_pack(provider, track): if provider == 'ect': From a105068ab22157a2e689b7deed4b7ca11550a927 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Tue, 12 Nov 2013 22:53:25 -0200 Subject: [PATCH 03/12] Add IbgeTracker.py #56 --- IbgeTracker.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++ PostmonServer.py | 2 +- database.py | 12 ++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 IbgeTracker.py diff --git a/IbgeTracker.py b/IbgeTracker.py new file mode 100644 index 0000000..80b78e5 --- /dev/null +++ b/IbgeTracker.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import requests +from lxml.html import fromstring +from database import MongoDb as Database + + +class IbgeTracker(): + + def __init__(self): + self.url_ufs = 'http://www.ibge.gov.br/home/geociencias' + \ + '/areaterritorial/principal.shtm' + self.url_cidades = 'http://www.ibge.gov.br/home/geociencias' + \ + '/areaterritorial/area.php?nome=%' + + def _request(self, url): + response = requests.post(url) + response.raise_for_status() + return response.text + + def _get_info_ufs(self, siglas): + texto = self._request(self.url_ufs) + html = fromstring(texto) + seletorcss_linhas = "div#miolo_interno > table > tr" + linhas = html.cssselect(seletorcss_linhas) + linhas.pop() # a primeira é o cabeçalho + infos = [] + for linha in linhas: + seletorcss_celulas = "td" + celulas = linha.cssselect(seletorcss_celulas) + codigo_ibge = celulas[0].text_content() + if codigo_ibge in siglas: + sigla = siglas[codigo_ibge] + infos.append({ + 'sigla': sigla, + 'codigo_ibge': codigo_ibge, + 'nome': celulas[1].text_content(), + 'area_km2': celulas[2].text_content() + }) + + # neste ponto, após a carga + # das cidades, a lista + # 'infos' deve estar populada + + return infos + + def _get_info_cidades(self): + texto = self._request(self.url_cidades) + html = fromstring(texto) + seletorcss_linhas = "div#miolo_interno > table > tr" + linhas = html.cssselect(seletorcss_linhas) + linhas.pop() # a primeira é o cabeçalho + infos = [] + for linha in linhas: + seletorcss_celulas = "td" + celulas = linha.cssselect(seletorcss_celulas) + infos.append({ + 'codigo_ibge_uf': celulas[0].text_content(), + 'sigla_uf': celulas[1].text_content(), + 'codigo_ibge_cidade': celulas[2].text_content(), + 'nome_cidade': celulas[3].text_content(), + 'area_km2': celulas[4].text_content() + }) + return infos + + def _track_ufs(self, db, siglas): + infos = self._get_info_ufs(siglas) + for info in infos: + db.insert_or_update_uf(info) + + def _track_cidades(self, db): + infos = self._get_info_cidades() + siglas = {} + for info in infos: + codigo_ibge_uf = info['codigo_ibge_uf'] + sigla_uf = info['sigla_uf'] + nome_cidade = info['nome_cidade'] + if codigo_ibge_uf not in siglas: + siglas[codigo_ibge_uf] = sigla_uf + + # a chave única de uma cidade não + # pode ser só o nome, pois + # existem cidades com mesmo nome + # em estados diferentes + info['sigla_uf_nome_cidade'] = '%s_%s' % (sigla_uf, nome_cidade) + + db.insert_or_update_cidade(info) + + return siglas + + def track(self, db): + """ + Atualiza as bases internas do mongo + com os dados mais recentes do IBGE + referente a ufs e cidades + """ + siglas = self._track_cidades(db) # siglas é um dict cod_ibge -> sigla: + # { '35': 'SP', '35': 'RJ', ... } + self._track_ufs(db, siglas) + + +def _standalone(): + db = Database() + ibge = IbgeTracker() + ibge.track(db) + + +if __name__ == "__main__": + _standalone() diff --git a/PostmonServer.py b/PostmonServer.py index e2afbd9..fbf7436 100644 --- a/PostmonServer.py +++ b/PostmonServer.py @@ -54,7 +54,7 @@ def format_result(result): def _get_estado_info(db, sigla): - sigla = sigla.lower() + sigla = sigla.upper() return db.get_one_uf(sigla, fields={'_id': False, 'sigla': False}) diff --git a/database.py b/database.py index b7b98ea..5b907d8 100644 --- a/database.py +++ b/database.py @@ -28,6 +28,9 @@ def get_one(self, cep, **kwargs): def get_one_uf(self, sigla, **kwargs): return self._db.ufs.find_one({'sigla': sigla}, **kwargs) + def get_one_uf_by_nome(self, nome, **kwargs): + return self._db.ufs.find_one({'nome': nome}, **kwargs) + def insert_or_update(self, obj, **kwargs): update = {'$set': obj} @@ -36,5 +39,14 @@ def insert_or_update(self, obj, **kwargs): self._db.ceps.update({'cep': obj['cep']}, update, upsert=True) + def insert_or_update_uf(self, obj, **kwargs): + update = {'$set': obj} + self._db.ufs.update({'sigla': obj['sigla']}, update, upsert=True) + + def insert_or_update_cidade(self, obj, **kwargs): + update = {'$set': obj} + chave = 'sigla_uf_nome_cidade' + self._db.cidades.update({chave: obj[chave]}, update, upsert=True) + def remove(self, cep): self._db.ceps.remove({'cep': cep}) From ff241774e864c9bdb233cfbc7cf9a56ee5260879 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Tue, 12 Nov 2013 23:12:54 -0200 Subject: [PATCH 04/12] Add cidade_info attr into cep route return obj #56 --- IbgeTracker.py | 8 ++++---- PostmonServer.py | 20 +++++++++++++++++++- database.py | 3 +++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/IbgeTracker.py b/IbgeTracker.py index 80b78e5..79d83da 100644 --- a/IbgeTracker.py +++ b/IbgeTracker.py @@ -57,8 +57,8 @@ def _get_info_cidades(self): infos.append({ 'codigo_ibge_uf': celulas[0].text_content(), 'sigla_uf': celulas[1].text_content(), - 'codigo_ibge_cidade': celulas[2].text_content(), - 'nome_cidade': celulas[3].text_content(), + 'codigo_ibge': celulas[2].text_content(), + 'nome': celulas[3].text_content(), 'area_km2': celulas[4].text_content() }) return infos @@ -74,7 +74,7 @@ def _track_cidades(self, db): for info in infos: codigo_ibge_uf = info['codigo_ibge_uf'] sigla_uf = info['sigla_uf'] - nome_cidade = info['nome_cidade'] + nome = info['nome'] if codigo_ibge_uf not in siglas: siglas[codigo_ibge_uf] = sigla_uf @@ -82,7 +82,7 @@ def _track_cidades(self, db): # pode ser só o nome, pois # existem cidades com mesmo nome # em estados diferentes - info['sigla_uf_nome_cidade'] = '%s_%s' % (sigla_uf, nome_cidade) + info['sigla_uf_nome_cidade'] = '%s_%s' % (sigla_uf, nome) db.insert_or_update_cidade(info) diff --git a/PostmonServer.py b/PostmonServer.py index fbf7436..a227697 100644 --- a/PostmonServer.py +++ b/PostmonServer.py @@ -58,6 +58,19 @@ def _get_estado_info(db, sigla): return db.get_one_uf(sigla, fields={'_id': False, 'sigla': False}) +def _get_cidade_info(db, sigla_uf, nome_cidade): + sigla_uf = sigla_uf.upper() + sigla_uf_nome_cidade = '%s_%s' % (sigla_uf, nome_cidade) + fields = { + '_id': False, + 'sigla_uf': False, + 'codigo_ibge_uf': False, + 'sigla_uf_nome_cidade': False, + 'nome': False + } + return db.get_one_cidade(sigla_uf_nome_cidade, fields=fields) + + @route('/cep/') @app_v1.route('/cep/') def verifica_cep(cep): @@ -84,9 +97,14 @@ def verifica_cep(cep): if result: response.headers['Cache-Control'] = 'public, max-age=2592000' - estado_info = _get_estado_info(db, result['estado']) + sigla_uf = result['estado'] + estado_info = _get_estado_info(db, sigla_uf) if estado_info: result['estado_info'] = estado_info + nome_cidade = result['cidade'] + cidade_info = _get_cidade_info(db, sigla_uf, nome_cidade) + if cidade_info: + result['cidade_info'] = cidade_info return format_result(result) else: response.status = '404 O CEP %s informado nao pode ser ' diff --git a/database.py b/database.py index 5b907d8..0c75fb1 100644 --- a/database.py +++ b/database.py @@ -28,6 +28,9 @@ def get_one(self, cep, **kwargs): def get_one_uf(self, sigla, **kwargs): return self._db.ufs.find_one({'sigla': sigla}, **kwargs) + def get_one_cidade(self, sigla_uf_nome_cidade, **kwargs): + return self._db.cidades.find_one({'sigla_uf_nome_cidade': sigla_uf_nome_cidade}, **kwargs) + def get_one_uf_by_nome(self, nome, **kwargs): return self._db.ufs.find_one({'nome': nome}, **kwargs) From 26e868dc97cdcba6b42d3d6ae0417c231e9ad20f Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Tue, 12 Nov 2013 23:16:23 -0200 Subject: [PATCH 05/12] Add cidade route #56 --- PostmonServer.py | 15 +++++++++++++++ database.py | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/PostmonServer.py b/PostmonServer.py index a227697..cee4964 100644 --- a/PostmonServer.py +++ b/PostmonServer.py @@ -127,6 +127,21 @@ def uf(sigla): return +@app_v1.route('/cidade//') +def cidade(sigla_uf, nome): + db = Database() + result = _get_cidade_info(db, sigla_uf, nome) + if result: + response.headers['Cache-Control'] = 'public, max-age=2592000' + return format_result(result) + else: + message = '404 A cidade %s (%s) informada ' \ + 'nao pode ser localizada' + response.status = message % (sigla_uf, nome) + print response.status + return + + @app_v1.route('/rastreio//') def track_pack(provider, track): if provider == 'ect': diff --git a/database.py b/database.py index 0c75fb1..7df62ef 100644 --- a/database.py +++ b/database.py @@ -29,7 +29,8 @@ def get_one_uf(self, sigla, **kwargs): return self._db.ufs.find_one({'sigla': sigla}, **kwargs) def get_one_cidade(self, sigla_uf_nome_cidade, **kwargs): - return self._db.cidades.find_one({'sigla_uf_nome_cidade': sigla_uf_nome_cidade}, **kwargs) + spec = {'sigla_uf_nome_cidade': sigla_uf_nome_cidade} + return self._db.cidades.find_one(spec, **kwargs) def get_one_uf_by_nome(self, nome, **kwargs): return self._db.ufs.find_one({'nome': nome}, **kwargs) From 8a7d4802d0aee0fb16c18d0facfd13d7d99bc09b Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Thu, 14 Nov 2013 21:43:09 -0200 Subject: [PATCH 06/12] Add PostmonTaskScheduler module #56 --- .gitignore | 1 + PostmonTaskScheduler.py | 33 +++++++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 35 insertions(+) create mode 100644 PostmonTaskScheduler.py diff --git a/.gitignore b/.gitignore index 6fd2097..521befa 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.swp run.py build +celerybeat-schedule diff --git a/PostmonTaskScheduler.py b/PostmonTaskScheduler.py new file mode 100644 index 0000000..126fe59 --- /dev/null +++ b/PostmonTaskScheduler.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from datetime import timedelta +from celery import Celery +from celery.utils.log import get_task_logger +from IbgeTracker import IbgeTracker +from database import MongoDb as Database + +app = Celery('postmon', broker='mongodb://localhost:27017') + +app.conf.update( + CELERY_TASK_SERIALIZER='json', + CELERY_ACCEPT_CONTENT=['json'], # Ignore other content + CELERY_RESULT_SERIALIZER='json', + CELERY_TIMEZONE='America/Sao_Paulo', + CELERY_ENABLE_UTC=True, + CELERYBEAT_SCHEDULE = { + 'track_ibge_daily': { + 'task': 'PostmonTaskScheduler.track_ibge', + 'schedule': timedelta(days=1) # útil para testes: timedelta(minutes=1) + } + } +) + +logger = get_task_logger(__name__) + +@app.task +def track_ibge(): + logger.info('Iniciando tracking do IBGE...') + db = Database() + ibge = IbgeTracker() + ibge.track(db) + logger.info('Finalizou o tracking do IBGE') diff --git a/requirements.txt b/requirements.txt index 2cf3561..95908b6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ webtest==1.4.3 packtrack==0.1.0 xmltodict flake8 +celery[mongodb] From 73bf541a4860eb8c149fbfed6e6e9274e7f37e87 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Thu, 14 Nov 2013 21:55:05 -0200 Subject: [PATCH 07/12] Fix pep8 errors #56 --- PostmonTaskScheduler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PostmonTaskScheduler.py b/PostmonTaskScheduler.py index 126fe59..5e23df8 100644 --- a/PostmonTaskScheduler.py +++ b/PostmonTaskScheduler.py @@ -14,16 +14,18 @@ CELERY_RESULT_SERIALIZER='json', CELERY_TIMEZONE='America/Sao_Paulo', CELERY_ENABLE_UTC=True, - CELERYBEAT_SCHEDULE = { + CELERYBEAT_SCHEDULE={ 'track_ibge_daily': { 'task': 'PostmonTaskScheduler.track_ibge', - 'schedule': timedelta(days=1) # útil para testes: timedelta(minutes=1) + 'schedule': timedelta(days=1) # útil para + # testes: timedelta(minutes=1) } } ) logger = get_task_logger(__name__) + @app.task def track_ibge(): logger.info('Iniciando tracking do IBGE...') From 16f5ac5d596e777f95393b173037273dd4f9e856 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Wed, 20 Nov 2013 20:46:47 -0200 Subject: [PATCH 08/12] Tell pep8 to ignore celery's celerybeat-schedule db file. ticket #56 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 70f396a..13108d1 100644 --- a/Makefile +++ b/Makefile @@ -5,4 +5,4 @@ test: pep8 .PHONY: pep8 pep8: - @flake8 * --ignore=F403,F401 --exclude=requirements.txt,*.pyc,*.md,COPYING,Makefile,*.wsgi + @flake8 * --ignore=F403,F401 --exclude=requirements.txt,*.pyc,*.md,COPYING,Makefile,*.wsgi,*celerybeat-schedule* From f765c7a4ebbfaa9911a1c35fe3d658e172e46c1a Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Wed, 20 Nov 2013 21:03:26 -0200 Subject: [PATCH 09/12] Make task scheduler aware of mongo auth env variables #56 --- PostmonTaskScheduler.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/PostmonTaskScheduler.py b/PostmonTaskScheduler.py index 5e23df8..f28dba3 100644 --- a/PostmonTaskScheduler.py +++ b/PostmonTaskScheduler.py @@ -5,8 +5,19 @@ from celery.utils.log import get_task_logger from IbgeTracker import IbgeTracker from database import MongoDb as Database +import os -app = Celery('postmon', broker='mongodb://localhost:27017') +USERNAME = os.environ.get('POSTMON_DB_USER') +PASSWORD = os.environ.get('POSTMON_DB_PASSWORD') +if all((USERNAME, PASSWORD)): + broker_conn_string = 'mongodb://%s:%s@localhost:27017' \ + % (USERNAME, PASSWORD) +else: + broker_conn_string = 'mongodb://localhost:27017' + +print(broker_conn_string) + +app = Celery('postmon', broker=broker_conn_string) app.conf.update( CELERY_TASK_SERIALIZER='json', From 31371f2db3c639004cf4b976c04840b7c8d1e9ee Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Mon, 25 Nov 2013 23:36:59 -0200 Subject: [PATCH 10/12] Update README.md with PostmonTaskScheduler and IBGE info #56 --- README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/README.md b/README.md index 0edec6a..d2673ae 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ As dependências estão listadas no arquivo requirements.txt. * nosetests * webtest * packtrack +* celery Rodando testes ---------------- @@ -41,6 +42,9 @@ ou Caso queira rodar em outra porta, basta passá-la como parametro no chamado do _standalone +Para rodar o [Scheduler](#Scheduler): + + $ celery worker -B -A PostmonTaskScheduler -l info MongoDB com autenticação ------------------------ @@ -60,3 +64,38 @@ Agora que seu Mongo está com password exporte as variaveis de ambiente. export POSTMON_DB_USER=admin export POSTMON_DB_PASSWORD=123456 ``` + +Scheduler +--------- + +O Postmon conta com um scheduler baseado na ferramenta [Celery](http://www.celeryproject.org/). Até o momento, a única funcionalidade implementada nessa estrutura é a rotina de coleta de dados do [IBGE](#IBGE). + +O Celery usa, como Broker, a mesma instância do MongoDB utilizada no módulo de CEP. + +O comando apresentado na seção [rodando a aplicação](#rodando-a-aplicação-localmente-na-porta-9876) pode ser quebrado em dois caso seja necessário rodar o Celery Worker separado do Celery Beat. Para mais informações sobre essa questão leia a [documentação do Celery](http://docs.celeryproject.org/en/latest/). + +Além do Broker, o Celery Beat depende internamente de uma base de dados, criada automaticamente na primeira execução, onde são armazenadas informações sobre os schedules. Por padrão essa base fica em um arquivo chamado _celerybeat_schedule_, criado no diretório onde o Celery Beat foi executado. Esse local pode ser alterado através do switch -s, conforme exemplo abaixo: + + $ celery worker -B -A PostmonTaskScheduler -l info -s /novo/caminho/para/arquivo/celerybeat_schedule + +IBGE +------------- + +O Postmon fornece as seguintes informações extraídas do site do IBGE: + +* Código do município/UF +* Área territorial (em km²) + +Essas informações estão presentes nos atributos _estado_info_ e _cidade_info_ da rota de busca de _cep_, bem como nas seguintes rotas: + +* /uf/{sigla-uf} +* /cidade/{sigla-uf}/{nome-cidade} + +Exemplos: + +* /uf/SP +* /cidade/SP/São Paulo +* /cidade/SP/Araraquara +* /cidade/RJ/Macaé + +A rotina de atualização desses dados está configurada para rodar diariamente. \ No newline at end of file From 1dcc9ef7995acd16ba567cac6be3b740d49c4d5e Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Mon, 25 Nov 2013 23:41:46 -0200 Subject: [PATCH 11/12] Fix minor formatting bugs #56 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d2673ae..975ee54 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ ou Caso queira rodar em outra porta, basta passá-la como parametro no chamado do _standalone -Para rodar o [Scheduler](#Scheduler): +Para rodar o [Scheduler](#scheduler): $ celery worker -B -A PostmonTaskScheduler -l info @@ -68,7 +68,7 @@ export POSTMON_DB_PASSWORD=123456 Scheduler --------- -O Postmon conta com um scheduler baseado na ferramenta [Celery](http://www.celeryproject.org/). Até o momento, a única funcionalidade implementada nessa estrutura é a rotina de coleta de dados do [IBGE](#IBGE). +O Postmon conta com um scheduler baseado na ferramenta [Celery](http://www.celeryproject.org/). Até o momento, a única funcionalidade implementada nessa estrutura é a rotina de coleta de dados do [IBGE](#ibge). O Celery usa, como Broker, a mesma instância do MongoDB utilizada no módulo de CEP. @@ -86,7 +86,7 @@ O Postmon fornece as seguintes informações extraídas do site do IBGE: * Código do município/UF * Área territorial (em km²) -Essas informações estão presentes nos atributos _estado_info_ e _cidade_info_ da rota de busca de _cep_, bem como nas seguintes rotas: +Essas informações estão presentes nos atributos *estado_info* e *cidade_info* da rota de busca de _cep_, bem como nas seguintes rotas: * /uf/{sigla-uf} * /cidade/{sigla-uf}/{nome-cidade} From 7944317d8d5e0c911ed0d39ff525c465368cceb7 Mon Sep 17 00:00:00 2001 From: Samuel Grigolato Date: Fri, 29 Nov 2013 00:27:04 -0200 Subject: [PATCH 12/12] Add Supervisord configuration example #56 --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 975ee54..45923e4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,18 @@ Para rodar o [Scheduler](#scheduler): $ celery worker -B -A PostmonTaskScheduler -l info +Recomenda-se a utilização do [Supervisord](http://supervisord.org/) para manter o Celery rodando. Exemplo de configuração para o _supervisord.conf_: + + [program:celeryd] + command=celery worker -B -A PostmonTaskScheduler -l info + directory=POSTMON_HOME/repositorio + stdout_logfile=POSTMON_LOG_DIR/celeryd.log + stderr_logfile=POSTMON_LOG_DIR/celeryd_err.log + autostart=true + autorestart=true + startsecs=10 + stopwaitsecs=600 + MongoDB com autenticação ------------------------