Django-Celery Database Access - python

django-celery-beat running so far ... tasks get queued and worker is executing simple tasks :)
now I would like to have my celery task to do a query towards the django database (to get a list of IP addresses for which I want to check reachability).
can i use the django 'helper code' to do the query or do I need to make a 'raw' connection from celery to sqlite/mysql?
thanks for any help on this
/pat
celery.py
# http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
#from celery import shared_task
from django.conf import settings
#settings.configure()
#from portal import models
#logger = logging.getLogger(__name__)
#from portal.models import location
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sc_custportal.settings')
app = Celery('sc_custportal')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
#app.config_from_object('django.conf:settings')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
#app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
queryset = location.objects.all()
# response = os.system("ping -c 1 8.8.8.8")
# if response == 0:
# print("up!")
error:
[2017-05-04 14:55:09,962: ERROR/PoolWorker-1] Task sc_custportal.celery.debug_task[ecb79b33-7246-4e4e-9b4e-3d7f9b0102dc] raised unexpected: NameError("global name 'location' is not defined",)
Traceback (most recent call last):
File "/home/pat/Documents/Development/sc_custportal/env/local/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/pat/Documents/Development/sc_custportal/env/local/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__
return self.run(*args, **kwargs)
File "/home/pat/Documents/Development/sc_custportal/sc_custportal/sc_custportal/celery.py", line 32, in debug_task
queryset = location.objects.all()
NameError: global name 'location' is not defined
tree:
sc_custportal
├── celerybeat.pid
├── celerybeat-schedule
├── db.sqlite3
├── manage.py
├── portal
│   ├── admin.py
│   ├── admin.pyc
│   ├── apps.py
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0001_initial.pyc
│   │   ├── 0002_auto_20170503_1212.py
│   │   ├── 0002_auto_20170503_1212.pyc
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── templates
│   │   ├── index.html
│   │   ├── inspinia.html
│   │   ├── issue_tracker.html
│   │   ├── login.html
│   │   ├── login.html.sic
│   │   ├── modal_window.html
│   │   ├── notifications.html
│   │   ├── partials
│   │   │   ├── footer.html
│   │   │   ├── head.html
│   │   │   ├── menu.html
│   │   │   └── scripts.html
│   │   ├── profile.html
│   │   ├── table_data_tables.html
│   │   └── toastr_notifications.html
│   ├── tests.py
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   └── views.pyc
├── rest
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── serializers.py
│   ├── serializers.pyc
│   ├── tests.py
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   └── views.pyc
└── sc_custportal
├── celery.py
├── celery.pyc
├── __init__.py
├── __init__.pyc
├── settings.py
├── settings.pyc
├── settings.py.orig
├── urls.py
├── urls.pyc
├── wsgi.py
└── wsgi.pyc

Yes, you can do it like
from portal.models import MyModel
#app.task(bind=True)
def debug_task(self):
MyModel.objects.all()
If you're considering accessing objects recently created/updated, please take care that the transaction commited before starting your task. Typically, you could start your task with a transaction.on_commit(your_task_call).
This answer gives you more details.

Related

Django, error importing view from another app

I'm trying to import a view from one app to another in my project.
When using this:
from ..from ..KnownLocation.views import KnownLocationView
I get the following error:
ValueError: attempted relative import beyond top-level package
When trying to use:
from triangulationapi.KnownLocation.views import KnownLocationView
It's raising the following error.
ModuleNotFoundError: No module named 'triangulationapi.KnownLocation'
my Project tree:
├── find_second_gdt
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── __pycache__
│   ├── second_GDT_finding
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── __init__.py
├── KnownLocation
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── __pycache__
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
├── requirements.txt.
└── triangulationapi
├── asgi.py
├── __init__.py
├── __pycache__
├── settings.py
├── urls.py
└── wsgi.py
And, what's the diffrence between using .. and project.app.view...
I thought it is the same up until now.
Try this:
from .KnownLocation.views import KnownLocationView

how can to Import from deeper subfolder?

I am trying to import my app function which is inside front/app __init__, but somehow from front.app import app it doesnt work from tooler.py.
.
├── settings
│   ├── settings.json
├── front
│   ├── app
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   └── views.cpython-36.pyc
│   │   ├── static
│   │   │   ├── css
│   │   │   │   └── demo.css
│   │   │   ├── data.json
│   │   │   └── js
│   │   │   └── script.js
│   │   ├── templates
│   │   │   └── public
│   │   │   └── index.html
│   │   ├── views.py
│   │   └── views.pyc
│   └── run.py
├── tooler.py
├── __pycache__
│   └── utils.cpython-36.pyc
├── requirements.txt
├── tester.py
├── tree
└── utils.py
run.py
from app import app
if __name__ == "__main__":
app.run()
init
from flask import Flask
app = Flask(__name__)
from app import views
I expect the output of running the server flask, but the actual output is ModuleNotFoundError: No module named 'app'

How to run django in a subpackage

My project results are as follows, django in automl/service, in automl/service/worker/suggester.py file has an import from automl.core import util and this file imported by views.py, when I run python service/manage.py runserver will raise the exception
from automl.core import util
ModuleNotFoundError: No module named 'automl'
how to solve this problem, does django can not run in a sub package?
├── automl
│   ├── __init__.py
│   ├── core
│   │   ├── __init__.py
│   │   └── base.py
│   ├── example
│   │   ├── __init__.py
│   │   └── demo.py
│   └── service
│   ├── __init__.py
│   ├── manage.py
│   ├── master
│   │   ├── __init__.py
│   │   └── urls.py
│   ├── settings.py
│   ├── worker
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── exceptions.py
│   │   ├── models.py
│   │   ├── suggester.py
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py
│   ├── urls.py
│   └── wsgi.py
├── bin
├── build.sh
├── ci.yml
├── conf
│   └── log_config.json
└── docs

How to import python function from another file into django views

I am trying to call a function from a python file that is located outside the django project directory from views.py. I have tried importing the python file but running the django server says "no module named xxxx".
Tree structure is given below.
├── auto_flash
│   ├── __init__.py
│   └── test.py
└── fireflash
├── detection_reports
│   ├── admin.py
│   ├── admin.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── __pycache__
│   │   └── __init__.cpython-35.pyc
│   ├── templates
│   │   └── detection_reports
│   │   └── home.html
│   ├── tests.py
│   ├── views.py
│   └── views.pyc
├── fireflash
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   └── settings.cpython-35.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── ui_cgi.py
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── __init__.py
└── manage.py
Project name here is "fireflash" and there is an app in that project named "detection_reports". There is another directory named "auto_flash" that has same location as "fireflash". What I want to do is to import test.py file from "auto_flash" in detection_reports.views and call a function from views. Importing like this "from auto_flash import test" throws error "no module named auto_flash".
I have tried all of the above mentioned solutions, but the cleaner solution was to append the path for auto_flash to syspath and the issue was resolved. Thanks to all of you for the efforts.
Move auto_flash to fireflash
In detection_reports add from auto_flash import test.py

Getting the python path set up properly scrapy/django

I have a scrapy project that I put it inside a Django project root folder.
And I have these lines added to the setting :
import sys
import os
sys.path.append('/home/user/Django-projects/first_project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'first_project.settings'
Now when I try to import a model in items.py :
from blog.models import Annonce
I get this message :
ImportError: No module named blog.models
Django project directory:
.
├── assets
│   ├── logo.jpg
│   └── screen.png
├── blog
│   ├── admin.py
│   ├── admin.pyc
│   ├── forms.py
│   ├── forms.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tests.py
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   └── views.pyc
├── database.sql
├── first_project
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── manage.py
├── scrapy project
│   ├── marocannonces
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── items.py
│   │   ├── items.pyc
│   │   ├── middlewares.py
│   │   ├── middlewares.pyc
│   │   ├── pipelines.py
│   │   ├── pipelines.pyc
│   │   ├── settings.py
│   │   ├── settings.pyc
│   │   └── spiders
│   │      └── some spiders here...
│   ├── scrapy.cfg
└── templates
└── blog
├── contact.html
├── home.html
└── read.html
How can I fix this please ?

Categories

Resources