How to call a function when a project starts.

55 views
Skip to first unread message

Chen Xu

unread,
Jul 30, 2014, 3:58:16 PM7/30/14
to django...@googlegroups.com
Hi Everyone:
I would like to call a function when my project starts, basically I want to call a do_something() when I run python manage.py runserver. However, when I put it into settings.py, it gets called twice, but I only want it to execute once.

Is there a good way to do it.

Thanks


--
⚡ Chen Xu

aRkadeFR

unread,
Jul 30, 2014, 4:01:49 PM7/30/14
to django...@googlegroups.com
Which version of Django are you running?
> --
> You received this message because you are subscribed to the Google Groups "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
> To post to this group, send email to django...@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CACac-qbTXbMGmYU%3D5R618rbt7pT%3DgTL%3DWAxhCR-prmuLbz-VKw%40mail.gmail.com.
> For more options, visit https://groups.google.com/d/optout.

Chen Xu

unread,
Jul 30, 2014, 4:02:49 PM7/30/14
to django...@googlegroups.com
I am running 1.6.2



For more options, visit https://groups.google.com/d/optout.



--
⚡ Chen Xu

Mike Dewhirst

unread,
Jul 30, 2014, 7:30:15 PM7/30/14
to django...@googlegroups.com
Maybe you could turn do_something() a singleton so it only executes once?

http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python




>
> Thanks
>
>
> --
> âš¡ Chen Xu âš¡
>
> --
> You received this message because you are subscribed to the Google
> Groups "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to django-users...@googlegroups.com
> <mailto:django-users...@googlegroups.com>.
> To post to this group, send email to django...@googlegroups.com
> <mailto:django...@googlegroups.com>.
> <https://groups.google.com/d/msgid/django-users/CACac-qbTXbMGmYU%3D5R618rbt7pT%3DgTL%3DWAxhCR-prmuLbz-VKw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Bill Freeman

unread,
Jul 31, 2014, 10:30:08 AM7/31/14
to django-users

It runs twice because runserver uses two processes: the real server, and; the monitoring process that restarts the other when you change a source file. You could fool around with undocumented internals to figure out which a given import is running in.  Or you could use a modifies runserver command. Or you could modify manage.py. Or you could, if your O/S supports it, open a file for exclusive use and the one that can't knows that it is the server process.

On Jul 30, 2014 7:30 PM, "Mike Dewhirst" <mi...@dewhirst.com.au> wrote:
On 31/07/2014 5:57 AM, Chen Xu wrote:
Hi Everyone:
I would like to call a function when my project starts, basically I want
to call a do_something() when I run python manage.py runserver. However,
when I put it into settings.py, it gets called twice, but I only want it
to execute once.

Is there a good way to do it.

Maybe you could turn do_something() a singleton so it only executes once?

http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python





Thanks


--
âš¡ Chen Xu âš¡

--
You received this message because you are subscribed to the Google
Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send

To post to this group, send email to django...@googlegroups.com
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.

cmawe...@gmail.com

unread,
Jul 31, 2014, 11:34:50 AM7/31/14
to django...@googlegroups.com
I think if you put it in urls.py it should run (once) just before the first request.

Russell Keith-Magee

unread,
Aug 1, 2014, 5:17:51 PM8/1/14
to Django Users

As others have pointed out, the reason putting it in settings.py causes it to be run twice is because settings is loaded twice when you use runserver. That won't happen in production, however, as the mod_wsgi binding doesn't require the "other" process when it's deployed through the wsgi interface.

I would **STRONGLY** recommend against the hacks suggested in this thread that involve building singleton objects, file-based locks, or other mechanisms that work around the fact that settings.py is invoked twice.

If you're using Django 1.6, the best option is to put the code in your top level urls.py. This is what admin does to discover all the apps in a Django system. It's not an ideal solution, but it works, and will only be executed once, and as close to "startup" as is practical.

If you're using a pre-release of Django 1.7, the new AppConfig class definitions are designed to provide the exact sort of 'startup configuration' you've asked about.


Yours,
Russ Magee %-)



--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.

To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
Reply all
Reply to author
Forward
0 new messages