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

ホームページ バックエンド開発 Python チュートリアル Django 開発者モードでは自動(dòng)リロードはどのように実裝されますか?

Django 開発者モードでは自動(dòng)リロードはどのように実裝されますか?

Aug 19, 2017 pm 02:47 PM
django 開発者

Django アプリケーションの開発プロセスでは、開発者モードを使用してサービスを開始するのが特に便利です。サービスを?qū)g行するために必要なのは python manage.py runserver だけです。これは、非常にユーザーフレンドリーな自動(dòng)リロード メカニズムを提供します。プログラムを手動(dòng)で再起動(dòng)してコードを変更し、フィードバックを確認(rèn)できます。初めて觸れたときは、「もっと使いやすい機(jī)能だ」という印象で、特に高度な技術(shù)だとは思いませんでした。後で時(shí)間があるときに、このオートリロードを?qū)g裝する場(chǎng)合はどうするかを考えましたが、ずっと考えてもわかりませんでした。私の最初の反応は、自分には野心がありすぎてスキルが不足しているということでした。そこで私は、Django が自動(dòng)リロードを?qū)g裝する方法を少し時(shí)間をかけて研究し、すべてのステップのソース コードを確認(rèn)しました。

1. Runserver コマンド。本題に入る前に、runserver コマンドの実行方法については実際には意味のないことがたくさんありますが、本題とはほとんど関係がないので、簡(jiǎn)単に説明します。
コマンド ラインで python manage.py runserver と入力した後、 Django は runserver コマンドの実行モジュールを探し、最終的に


#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."


モジュールにたどり著きます。そして、このコマンドの実行関數(shù)はここにあります:


#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)


use_reloaderに関する判定は以下の通りです。起動(dòng)コマンドに --noreload を追加しない場(chǎng)合、プログラムは autoreload.main 関數(shù)に移動(dòng)し、追加すると self.inner_run に移動(dòng)し、アプリケーションを直接起動(dòng)します。

実際、autoreload.main のパラメータから、autoreload のメカニズムがこれらのカプセル化に含まれていることがわかります。

追記: ソース コードを見たところ、Django のコマンド モードは依然として非常に美しく実裝されており、學(xué)ぶ価値があることがわかりました。

2. 自動(dòng)リロードモジュール。 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)


ここで、jpython と他の Python を區(qū)別します。最初に jpython を無視して main_func のエラーを処理し、それを最初に無視します。 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


初めてここに來たとき、環(huán)境変數(shù)の RUN_MAIN 変數(shù)は「true」ではなく、そこにもありませんでした。それでは、他の場(chǎng)所に行き、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
を見てください。


ここでは、まず while ループを開始し、內(nèi)部で RUN_MAIN を "true" に変更してから、os.spawnve メソッドを使用してサブプロセス (サブプロセス) を開きます。

の説明を見てください。

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


実際には、コマンドラインを再度調(diào)整して、python manage.py runserver を再度実行するだけです。

次に、restart_with_reloader の while ループを見てください。while ループが終了するための唯一の條件は exit_code!=3 であることに注意してください。 子プロセスが終了しない場(chǎng)合は、os.spawnve ステップで停止します。子プロセスが終了し、終了コードが 3 でない場(chǎng)合は、while が終了し、ループが続行され、子プロセスは終了します。再作成されました。このロジックから、自動(dòng)リロードのメカニズムを推測(cè)できます?,F(xiàn)在のプロセス (メイン プロセス) は実際には何もしませんが、子プロセスが exit_code=3 で終了した場(chǎng)合は子プロセスの実行ステータスを監(jiān)視します。 (ファイルが変更されたときの検出によるものです)、サブプロセスを再度開始すると、新しいコードが自然に有効になります。サブプロセスが exit_code!=3 で終了すると、メイン プロセスも終了します。 Django プログラム全體がダウンします。これは単なる推測(cè)ですので、以下で検証していきます。

3. 子プロセス。実は、再起動(dòng)したのに、なぜ子プロセスが子プロセスを生成しないのかという疑問があります。その理由は、メインプロセスで RUN_MAIN 環(huán)境変數(shù)が true に変更されるためです。サブプロセスが python_reloader 関數(shù)に進(jìn)むとき、條件が満たされると、ロジックがメインプロセスと異なります。プロセスの分岐。ここでは、まずスレッドを開き、上記の Command.inner_run である main_func を?qū)g行します。ここのスレッド モジュールは次のようにインポートされます:


#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


ここでの 6 つのモジュールの役割は、さまざまな Python バージョンと互換性があることです:


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


python2 と python3 で実行可能 ランニング、ルパン、シックスは重要なツールです。次に、時(shí)間をかけて 6 つを見て印を付けます。

次に reloader_thread を開きます:


[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)說明:#?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.

ensure_echo_on() 実は、これは unix 風(fēng)のシステムファイル処理のためのもののようですので、最初はスキップしてください。システムファイル操作に関連する変數(shù) inotify が利用可能かどうかに基づいてファイル変更を検出する方法を選択します。

ループ中、1秒ごとにファイルのステータスをチェックします。通常のファイルに変更があった場(chǎng)合、プロセスは終了コード3で終了します。メインプロセスは終了コードが3であることを確認(rèn)すると、子プロセスを再起動(dòng)します。プロセス。 。 。 。これは、通常のファイル変更ではなく、I18N_MODIFIED (拡張子 .mo が付いているファイル変更、バイナリ ライブラリ ファイルなど) の場(chǎng)合は、reset_translations に関連します。これは、おそらく次回ロードされたライブラリ キャッシュをクリアすることを意味します。 。

上記はオートリロード機(jī)構(gòu)のプロセスです。さまざまなオペレーティング システムでのファイル変更の検出など、特に明確ではない詳細(xì)がまだいくつかありますが、これらは非常に詳細(xì)なものであり、メインのプロセスには関與しません。これを読んだ後、私はオートリロード機(jī)構(gòu)の設(shè)計(jì)を頼まれたらどうするだろうかと改めて自問しました。私の答えは、「djangoutilsautoreload.py ファイルを直接使用する」です。実際、これは非常に獨(dú)立したモジュールであり、汎用の自動(dòng)リロード ソリューションとして使用することもできます。

以上がDjango 開発者モードでは自動(dòng)リロードはどのように実裝されますか?の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Djangoのバージョンを確認(rèn)する方法 Djangoのバージョンを確認(rèn)する方法 Dec 01, 2023 pm 02:25 PM

Django のバージョンを確認(rèn)する手順: 1. ターミナルまたはコマンド プロンプト ウィンドウを開きます; 2. Django がインストールされていることを確認(rèn)します Django がインストールされていない場(chǎng)合は、パッケージ管理ツールを使用してインストールし、 pip install django コマンドを入力します。 3. インストールが完了したら、python -m django --version を使用して Django のバージョンを確認(rèn)できます。

Django フレームワークの長(zhǎng)所と短所: 知っておくべきことすべて Django フレームワークの長(zhǎng)所と短所: 知っておくべきことすべて Jan 19, 2024 am 09:09 AM

Django は、Web 開発ライフサイクルのあらゆる側(cè)面をカバーする完全な開発フレームワークです?,F(xiàn)在、このフレームワークは世界中で最も人気のある Web フレームワークの 1 つです。 Django を使用して獨(dú)自の Web アプリケーションを構(gòu)築する場(chǎng)合は、Django フレームワークの長(zhǎng)所と短所を理解する必要があります。具體的なコード例も含め、知っておくべきことはすべてここにあります。 Django の利點(diǎn): 1. 迅速な開発 - Django は Web アプリケーションを迅速に開発できます。豊富なライブラリと內(nèi)部を提供します。

Django vs. Flask: Python Web フレームワークの比較分析 Django vs. Flask: Python Web フレームワークの比較分析 Jan 19, 2024 am 08:36 AM

Django と Flask はどちらも Python Web フレームワークのリーダーであり、それぞれに獨(dú)自の利點(diǎn)と適用可能なシナリオがあります。この記事では、これら 2 つのフレームワークを比較分析し、具體的なコード例を示します。開発の概要 Django はフル機(jī)能の Web フレームワークであり、その主な目的は、複雑な Web アプリケーションを迅速に開発することです。 Django は、ORM (オブジェクト リレーショナル マッピング)、フォーム、認(rèn)証、管理バックエンドなどの多くの組み込み機(jī)能を提供します。これらの機(jī)能により、Django は大規(guī)模なデータを処理できるようになります。

Django バージョンをアップグレードする方法: 手順と考慮事項(xiàng) Django バージョンをアップグレードする方法: 手順と考慮事項(xiàng) Jan 19, 2024 am 10:16 AM

Django バージョンをアップグレードする方法: 手順と考慮事項(xiàng)、必要な特定のコード例 はじめに: Django は、より優(yōu)れたパフォーマンスとより多くの機(jī)能を提供するために継続的に更新およびアップグレードされる強(qiáng)力な Python Web フレームワークです。ただし、古いバージョンの Django を使用している開発者にとって、Django のアップグレードはいくつかの課題に直面する可能性があります。この記事では、Djangoのバージョンアップの手順や注意點(diǎn)、具體的なコード例を紹介します。 1. Djan をアップグレードする前にプロジェクト ファイルをバックアップします。

Tmall Elf Cloud アクセス サービスのアップグレード: 開発者料金が無料 Tmall Elf Cloud アクセス サービスのアップグレード: 開発者料金が無料 Jan 09, 2024 pm 10:06 PM

1月9日の當(dāng)サイトのニュースによると、天貓エルフは最近、ゆんゆんアクセスサービスのアップグレードを発表し、アップグレードされたゆんゆんアクセスサービスは1月1日から無料モードから有料モードに変更される。このサイトには新機(jī)能と最適化が含まれています: クラウド プロトコルを最適化してデバイス接続の安定性を向上、主要カテゴリの音聲制御を最適化、アカウント認(rèn)証のアップグレード: Tmall Genie に開発者のサードパーティ アプリの表示機(jī)能を追加して、ユーザーがより速く更新できるようにしますアカウントのバインドに便利であり、同時(shí)に、開発者向けのサードパーティのアプリアカウント認(rèn)証が追加され、Tmall Elf アカウントのワンクリックバインドをサポートし、端末畫面の表示インタラクション機(jī)能が追加されました。音聲インタラクションに加えて、 、ユーザーはアプリと畫面のスピーカーを通じてデバイスを制御し、情報(bào)を取得できます。機(jī)器のステータス、新しいインテリジェントなシーン連攜機(jī)能、新しい製品の屬性とイベント、Tmall を定義するステータスまたはイベントとして報(bào)告できます。

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質(zhì)問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側(cè)プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場(chǎng)合、フロントエンドとバックエンドのプログラムをそれぞれ獨(dú)立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を?qū)g裝できます。

Djangoのバージョンを確認(rèn)する方法 Djangoのバージョンを確認(rèn)する方法 Nov 30, 2023 pm 03:08 PM

Django のバージョンを確認(rèn)する方法: 1. コマンド ラインで確認(rèn)するには、ターミナルまたはコマンド ライン ウィンドウで「python -m django --version」コマンドを入力します。 2. Python 対話型環(huán)境で確認(rèn)するには、「import django」と入力します。 print(django.get_version())" code; 3. Django プロジェクトの設(shè)定ファイルを確認(rèn)し、インストールされているアプリケーション情報(bào)を含む INSTALLED_APPS という名前のリストを見つけます。

Django はフロントエンドですか、それともバックエンドですか? Django はフロントエンドですか、それともバックエンドですか? Nov 21, 2023 pm 02:36 PM

バックエンドは django です。詳細(xì): Django は主にバックエンド フレームワークですが、フロントエンド開発と密接に関連しています。 Django のテンプレート エンジン、靜的ファイル管理、RESTful API などの機(jī)能を通じて、フロントエンド開発者はバックエンド開発者と協(xié)力して、強(qiáng)力でスケーラブルな Web アプリケーションを構(gòu)築できます。

See all articles