How to call a function when a project starts.

56 vues
Accéder directement au premier message non lu

Chen Xu

non lue,
30 juil. 2014, 15:58:1630/07/2014
à 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

non lue,
30 juil. 2014, 16:01:4930/07/2014
à 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

non lue,
30 juil. 2014, 16:02:4930/07/2014
à django...@googlegroups.com
I am running 1.6.2



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



--
⚡ Chen Xu

Mike Dewhirst

non lue,
30 juil. 2014, 19:30:1530/07/2014
à 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

non lue,
31 juil. 2014, 10:30:0831/07/2014
à 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

non lue,
31 juil. 2014, 11:34:5031/07/2014
à django...@googlegroups.com
I think if you put it in urls.py it should run (once) just before the first request.

Russell Keith-Magee

non lue,
1 août 2014, 17:17:5101/08/2014
à 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.
Répondre à tous
Répondre à l'auteur
Transférer
0 nouveau message