国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison développement back-end Tutoriel Python Comment le rechargement automatique est-il implémenté en mode développeur Django??

Comment le rechargement automatique est-il implémenté en mode développeur Django??

Aug 19, 2017 pm 02:47 PM
django Promoteur

Dans le processus de développement d'applications Django, il est particulièrement pratique d'utiliser le mode développeur pour démarrer les services. Vous n'avez besoin que de python manage.py runserver pour exécuter le service, et il fournit un mécanisme de rechargement automatique très convivial, qui n'est pas nécessaire. nécessite une opération manuelle. Redémarrez le programme pour modifier le code et voir les commentaires. Lorsque je l’ai découvert pour la première fois, je pensais que cette fonction était plus conviviale et je ne pensais pas qu’il s’agissait d’une technologie particulièrement avancée. Plus tard, quand j'avais du temps libre, j'ai réfléchi à ce que je ferais si je devais implémenter ce rechargement automatique. Après avoir longuement réfléchi, je n'arrivais pas à comprendre. Il y avait toujours des choses que je n'arrivais pas à comprendre. . Il semble que ma première réaction ait été que j’avais trop d’ambition et pas assez de compétences. J'ai donc passé du temps à étudier comment Django implémente le rechargement automatique, j'ai regardé le code source pour chaque étape et je n'ai rien laissé pour acquis?:

1. Avant d'entrer dans le sujet, il y a en fait un long paragraphe d'absurdités sur la fa?on dont la commande runserver est exécutée. Cela n'a pas grand-chose à voir avec le sujet, je vais donc le mentionner brièvement :
Après avoir tapé python manage.py runserver sur le ligne de commande, Django va chercher la commande runserver. Le module d'exécution tombe finalement sur le module
djangocontribstaticfilesmanagementcommandsrunserver.py :


#django\contrib\staticfiles\management\commands\runserver.pyfrom?django.core.management.commands.runserver?import?\
Command?as?RunserverCommandclass?Command(RunserverCommand):
  help?=?"Starts?a?lightweight?Web?server?for?development?and?also?serves?static?files."


.

La fonction d'exécution de cette commande est ici?:


#django\core\management\commands\runserver.pyclass?Command(BaseCommand):
  def?run(self,?**options):
  """  Runs?the?server,?using?the?autoreloader?if?needed
  """  use_reloader?=?options['use_reloader']

  if?use_reloader:
    autoreload.main(self.inner_run,?None,?options)
  else:
    self.inner_run(None,?**options)


Voici les jugements sur use_reloader. Si nous n'ajoutons pas --noreload dans la commande de démarrage, le programme ira à la fonction autoreload.main Si nous l'ajoutons, il ira à self.inner_run et démarrera directement l'application.
En fait, il ressort des paramètres de autoreload.main qu'il devrait avoir une certaine encapsulation de self.inner_run. Le mécanisme de rechargement automatique est dans ces encapsulations.

PS?: Quand j'ai regardé le code source, j'ai trouvé que le mode commande de Django est magnifiquement implémenté et mérite d'être appris.

2. module de rechargement automatique. Regardez autoreload.main()?:


#django\utils\autoreload.py:def?main(main_func,?args=None,?kwargs=None):
  if?args?is?None:
    args?=?()
  if?kwargs?is?None:
    kwargs?=?{}
  if?sys.platform.startswith('java'):
    reloader?=?jython_reloader
  else:
    reloader?=?python_reloader

  wrapped_main_func?=?check_errors(main_func)
  reloader(wrapped_main_func,?args,?kwargs)


Ici, nous faisons une distinction entre jpython et les autres pythons, ignorez d'abord jpython?; check_errors Ignorez simplement la gestion des erreurs de main_func. Regardez python_reloader?:


#django\utils\autoreload.py:def?python_reloader(main_func,?args,?kwargs):
  if?os.environ.get("RUN_MAIN")?==?"true":
    thread.start_new_thread(main_func,?args,?kwargs)
    try:
      reloader_thread()
    except?KeyboardInterrupt:
      pass  else:
    try:
      exit_code?=?restart_with_reloader()
      if?exit_code?<?0:
        os.kill(os.getpid(),?-exit_code)
      else:
        sys.exit(exit_code)
    except?KeyboardInterrupt:
      pass


Quand je suis arrivé ici pour la première fois, la variable RUN_MAIN dans la variable d'environnement n'était pas "true", ou même Non, alors allez ailleurs et regardez restart_with_reloader?:


#django\utils\autoreload.py:def?restart_with_reloader():????while?True:
????  args?=?[sys.executable]?+?['-W%s'?%?o?for?o?in?sys.warnoptions]?+?sys.argv
    if?sys.platform?==?"win32":
      args?=?['"%s"'?%?arg?for?arg?in?args]
    new_environ?=?os.environ.copy()
    new_environ["RUN_MAIN"]?=?'true'    exit_code?=?os.spawnve(os.P_WAIT,?sys.executable,?args,?new_environ)
    if?exit_code?!=?3:
      return?exit_code


Ici, nous démarrons d'abord une boucle while et modifions en interne RUN_MAIN sur "true", puis utilisez la méthode os.spawnve pour ouvrir un sous-processus (sous-processus), jetez un ?il aux instructions de os.spawnve?:


  ?_spawnvef(mode,?file,?args,?env,?execve)


En fait, je viens d'ajuster à nouveau la ligne de commande et d'exécuter à nouveau python manage.py runserver.

Ensuite, regardez la boucle while dans restart_with_reloader. Il convient de noter que la seule condition pour que la boucle while se termine est exit_code!=3. Si le processus enfant ne se termine pas, il s'arrêtera à l'étape os.spawnve?; si le processus enfant se termine et que le code de sortie n'est pas 3, le while est terminé s'il est 3, la boucle continue et le processus enfant est terminé?; recréé. à partir de cette logique, nous pouvons deviner le mécanisme de rechargement automatique?: le processus actuel (processus principal) ne fait rien, mais surveille l'état d'exécution du processus enfant. Le processus enfant est réel si le processus enfant se termine avec exit_code=3?; (cela devrait être d? à une détection lorsque le fichier est modifié), redémarrez le sous-processus et le nouveau code prendra naturellement effet si le sous-processus se termine avec exit_code!=3, le processus principal se terminera également et ; tout le programme Django sera arrêté. Ceci n’est qu’une conjecture et sera vérifiée ci-dessous.

3. Processus enfant. Il y a en fait une question ci-dessus puisqu'il a été redémarré, pourquoi le processus enfant ne génère-t-il pas de processus enfants ? La raison en est que la variable d'environnement RUN_MAIN est remplacée par true dans le processus principal lorsque le processus enfant accède à la fonction python_reloader?:


#django\utils\autoreload.py:def?python_reloader(main_func,?args,?kwargs):
  if?os.environ.get("RUN_MAIN")?==?"true":
    thread.start_new_thread(main_func,?args,?kwargs)
    try:
      reloader_thread()
    except?KeyboardInterrupt:
      pass  else:
    try:
      exit_code?=?restart_with_reloader()
      if?exit_code?<?0:
        os.kill(os.getpid(),?-exit_code)
      else:
        sys.exit(exit_code)
    except?KeyboardInterrupt:
      pass


Si la condition est remplie, cela prendra une branche logique différente du processus principal. Ici, ouvrez d’abord un fil de discussion et exécutez main_func, qui est Command.inner_run ci-dessus. Le module thread ici est importé comme ceci?:


#django\utils\autoreload.py:from?django.utils.six.moves?import?_thread?as?thread


Le r?le du module six ici est d'être compatible avec divers python versions?:


[codeblock?six]#django\utils\six.pyclass?_SixMetaPathImporter(object):"""A?meta?path?importer?to?import?six.moves?and?its?submodules.

This?class?implements?a?PEP302?finder?and?loader.?It?should?be?compatible
with?Python?2.5?and?all?existing?versions?of?Python3"""官網(wǎng)說(shuō)明:#?https://pythonhosted.org/six/Six:?Python?2?and?3?Compatibility?Library
Six?provides?simple?utilities?for?wrapping?over?differences?between?Python?2?and?Python?3.?It?is?intended?to?support?codebases?that?work?on?both?Python?2?and?3?without?modification.?six?consists?of?only?one?Python?file,?so?it?is?painless?to?copy?into?a?project.


Donc, si le programme veut fonctionner à la fois sur python2 et python3, et sur Lupin, six est un outil important. Ensuite, prenez le temps d’en regarder six et de le noter.

Ensuite, ouvrez un reloader_thread?:


===?change?==3)?    ?change?==1)


ensure_echo_on() En fait, je ne l'ai pas encore compris, il semble que pour le traitement des fichiers système de type Unix, ignorez-le d'abord?;

USE_INOTIFY est également une variable liée aux opérations sur les fichiers système. Choisissez la méthode pour détecter les modifications de fichiers en fonction de la disponibilité ou non d'inotify.
En boucle While, vérifiez l'état du fichier toutes les 1 secondes. S'il y a un changement dans le fichier ordinaire, le processus se terminera avec un code de sortie de 3. Lorsque le processus principal verra que le code de sortie est 3, il redémarrera. le processus enfant. . . . Ceci est lié à ce qui précède?; s'il ne s'agit pas d'un changement de fichier ordinaire, mais de I18N_MODIFIED (changement de fichier avec le suffixe .mo, fichier de bibliothèque binaire, etc.), alors reset_translations, ce qui signifie probablement vider le cache de la bibliothèque chargée la prochaine fois. .

Ce qui précède est le processus du mécanisme de rechargement automatique. Il y a encore quelques détails qui ne sont pas particulièrement clairs, comme la détection des modifications de fichiers dans différents systèmes d'exploitation, mais ce sont des choses très détaillées et n'impliquent pas le processus principal. Après avoir lu ceci, je me suis demandé à nouveau : que ferais-je si on me demandait de concevoir le mécanisme de rechargement automatique ? Maintenant, ma réponse est : utilisez directement le fichier djangoutilsautoreload.py. En fait, il s'agit d'un module très indépendant et très polyvalent. Il peut être utilisé comme solution de rechargement automatique universelle. Je l'ai même écrit moi-même.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Comment vérifier la version de Django Comment vérifier la version de Django Dec 01, 2023 pm 02:25 PM

étapes pour vérifier la version de Django?: 1. Ouvrez un terminal ou une fenêtre d'invite de commande?; 2. Assurez-vous que Django n'est pas installé, vous pouvez utiliser l'outil de gestion de packages pour l'installer et entrer la commande pip install django 3?; . Une fois l'installation terminée, vous pouvez utiliser python -m django --version pour vérifier la version de Django.

Avantages et inconvénients du framework Django?: tout ce que vous devez savoir Avantages et inconvénients du framework Django?: tout ce que vous devez savoir Jan 19, 2024 am 09:09 AM

Django est un framework de développement complet qui couvre tous les aspects du cycle de vie du développement Web. Actuellement, ce framework est l’un des frameworks Web les plus populaires au monde. Si vous envisagez d'utiliser Django pour créer vos propres applications Web, vous devez alors comprendre les avantages et les inconvénients du framework Django. Voici tout ce que vous devez savoir, y compris des exemples de code spécifiques. Avantages de Django : 1. Développement rapide : Djang peut développer rapidement des applications Web. Il fournit une bibliothèque riche et interne

Django vs Flask?: une analyse comparative des frameworks Web Python Django vs Flask?: une analyse comparative des frameworks Web Python Jan 19, 2024 am 08:36 AM

Django et Flask sont tous deux leaders dans les frameworks Web Python, et ils ont tous deux leurs propres avantages et scénarios applicables. Cet article procédera à une analyse comparative de ces deux frameworks et fournira des exemples de code spécifiques. Introduction au développement Django est un framework Web complet, son objectif principal est de développer rapidement des applications Web complexes. Django fournit de nombreuses fonctions intégrées, telles que ORM (Object Relational Mapping), formulaires, authentification, backend de gestion, etc. Ces fonctionnalités permettent à Django de gérer de grandes

Comment mettre à niveau la version de Django : étapes et considérations Comment mettre à niveau la version de Django : étapes et considérations Jan 19, 2024 am 10:16 AM

Comment mettre à niveau la version de Django : étapes et considérations, exemples de code spécifiques requis Introduction : Django est un puissant framework Web Python qui est continuellement mis à jour et mis à niveau pour offrir de meilleures performances et plus de fonctionnalités. Cependant, pour les développeurs utilisant des versions plus anciennes de Django, la mise à niveau de Django peut rencontrer certains défis. Cet article présentera les étapes et les précautions à suivre pour mettre à niveau la version de Django et fournira des exemples de code spécifiques. 1. Sauvegardez les fichiers du projet avant de mettre à niveau Djan

Mise à niveau du service d'accès Tmall Elf Cloud?: frais de développement gratuits Mise à niveau du service d'accès Tmall Elf Cloud?: frais de développement gratuits Jan 09, 2024 pm 10:06 PM

Selon les informations de ce site du 9 janvier, Tmall Elf a récemment annoncé la mise à niveau du service d'accès Yunyun. Le service d'accès Yunyun mis à niveau passera du mode gratuit au mode payant à partir du 1er janvier. Ce site est doté de nouvelles fonctionnalités et optimisations : optimisation du protocole cloud pour améliorer la stabilité des connexions des appareils ; optimisation du contr?le vocal pour les catégories clés de mise à niveau des autorisations de compte : ajout de la fonction d'affichage des applications tierces des développeurs dans Tmall Genie pour aider les utilisateurs à mettre à jour plus rapidement ; C'est pratique pour la liaison de compte. Dans le même temps, l'autorisation de compte d'application tierce pour les développeurs a été ajoutée pour prendre en charge la liaison en un clic des comptes Tmall Elf ; , les utilisateurs peuvent contr?ler les appareils et obtenir des informations via l'application et les haut-parleurs de l'écran. L'état de l'équipement?; de nouvelles capacités de liaison de scène intelligentes, de nouveaux attributs et événements de produit, qui peuvent être signalés comme état ou événements pour définir Tmall.

Django est-il front-end ou back-end ? Vérifiez-le! Django est-il front-end ou back-end ? Vérifiez-le! Jan 19, 2024 am 08:37 AM

Django est un framework d'application Web écrit en Python qui met l'accent sur un développement rapide et des méthodes propres. Bien que Django soit un framework Web, pour répondre à la question de savoir si Django est un front-end ou un back-end, vous devez avoir une compréhension approfondie des concepts de front-end et de back-end. Le front-end fait référence à l'interface avec laquelle les utilisateurs interagissent directement, et le back-end fait référence aux programmes c?té serveur. Ils interagissent avec les données via le protocole HTTP. Lorsque le front-end et le back-end sont séparés, les programmes front-end et back-end peuvent être développés indépendamment pour mettre en ?uvre respectivement la logique métier et les effets interactifs, ainsi que l'échange de données.

Comment vérifier la version de Django Comment vérifier la version de Django Nov 30, 2023 pm 03:08 PM

Comment vérifier la version de Django?: 1. Pour vérifier via la ligne de commande, entrez la commande "python -m django --version" dans la fenêtre du terminal ou de la ligne de commande. 2. Pour vérifier dans l'environnement interactif Python, entrez "import django?; print(django. get_version())" code?; 3. Vérifiez le fichier de paramètres du projet Django et recherchez une liste nommée INSTALLED_APPS, qui contient des informations sur les applications installées.

Django est-il front-end ou back-end ? Django est-il front-end ou back-end ? Nov 21, 2023 pm 02:36 PM

Django est le back-end. Détails : Bien que Django soit avant tout un framework backend, il est étroitement lié au développement front-end. Grace à des fonctionnalités telles que le moteur de modèles de Django, la gestion de fichiers statiques et l'API RESTful, les développeurs front-end peuvent collaborer avec les développeurs back-end pour créer des applications Web puissantes et évolutives.

See all articles