IIS 7+でDjango 1.9を展開する

まえがき


みなさんこんにちは!


少し前に、サイトを作成するように依頼されました。 「 これが欲しい 」というたくさんの興味深い大規模プロジェクト。 願いの中には、書くためのWebフレームワークを決定する2つの主なものがありまし 。これは国際化管理パネルです。 記事のタイトルからすでに明らかなように、 Djangoはそのようなフレームワークになっています。


開始時、および開発のほぼすべての時点で、 サーバーというものは1つもありませんでした。 それはドメイン名であり、ウェブサイトは活発なペースで開発されていました。デザイナーがプロジェクトに参加しましたが、そのようなサーバーを私たちに割り当てることができませんでした。 すべてのサイトの印象は私のラップトップで行われたため、顧客が夕方にコーヒーを片手に座ったり、リラックスしたり、すでに行ったことを楽しんだりすることができませんでした。 また、私たちの仕事を人々に見せることができなかったため、フィードバックを受け取ることができませんでした。


そして、先日、奇跡が起こったと言うかもしれません-私たちにはサーバーがあります。 そして、その結果としてこの記事があります。



問題


私の喜びは長くはありませんでした。 サイトはDjango上にあり、サーバーはWindows Server 2012上にあります 。 最初の考え:


python manage.py runserver 80 

サーバー上のブラウザでサイトを開きます-すべてが機能します。 すごい 。 ホームマシンでサイトを開き、サイトが利用できないことを確認します。 悲しみ


次のアイデアは、 IISを使用することです。 しかし、どのように? 「 OK Google 」は、さまざまな言語のたくさんの記事を私に与えてくれました。 また、マイクロソフトのHabrDjangoの公式Webサイト からの記事も無視しませんでしたが、これらのソリューションはすべて面倒で、シンプルでエレガントなものが必要でした。


何がありますか



サイト構造(ツリーの一部):


 project/ manage.py project/ __init__.py settings.py urls.py wsgi.py 

IISにDjangoデプロイする問題を解決しましょう。


問題解決


Python

すべてが簡単です。wfastcgiをインストールすれば完了です。


 pip install wfastcgi 

すべてのPythonフレームワークに対してIISを1回構成するには、グローバル環境にインストールすることをお勧めします。


IIS

次に、 IISを構成しますWindows Serverでは、このコンポーネントはデフォルトですでにインストールされていますが、完全ではありません。 私たちのサイトの重要なコンポーネントであるCGIを意味します。


WindowsコンポーネントIISインターネットサービスアプリケーション開発コンポーネントCGI


それをインストールします。 IISマネージャーには、サーバーにFastCGI設定項目があります。


iis_manager_scrin


次にそれに入ります。 おそらく、wfastcgiをインストールする前にすでにCGIをインストールしていた場合、すでにその行があります。


fastcgi_settings


それ以外の場合は、[ アプリケーションの追加... ]をクリックして、フィールドに入力します。



すべてがOKです 。 主な部分は完了です。 次に、 新しいサイトを作成します 。 そして、サイトでHandler Mappingsを選択します。


handler_mappings


ハンドラーマッピング-> モジュール マッピングの 追加



次に、 OK 。 IISが構成されます。


Djangoアプリ

プロジェクトをサイトフォルダーにコピーします。 仮想環境を作成します。 同じフォルダーにweb.configファイルを作成します (または、既に作成されている場合は編集用に開きます )。


web.config
 <?xml version="1.0" encoding="UTF-8"?> <configuration> <appSettings> <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="django.core.wsgi.get_wsgi_application()" /> <add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="venv\Scripts\activate_this.py" /> <add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_virtualenv_handler()" /> <add key="PYTHONPATH" value="%APPL_PHYSICAL_PATH%" /> <add key="DJANGO_SETTINGS_MODULE" value="project.settings" /> </appSettings> <system.webServer> <handlers> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python\python.exe|C:\Python\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" /> </handlers> </system.webServer> </configuration> 

また、 ptvs_virtualenv_proxy.pyを作成し、以下のコードを貼り付けます


ptvs_virtualenv_proxy.py
 # ############################################################################ # # Copyright (c) Microsoft Corporation. # # This source code is subject to terms and conditions of the Apache License, Version 2.0. A # copy of the license can be found in the License.html file at the root of this distribution. If # you cannot locate the Apache License, Version 2.0, please send an email to # vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound # by the terms of the Apache License, Version 2.0. # # You must not remove this notice, or any other, from this software. # # ########################################################################### import datetime import os import sys if sys.version_info[0] == 3: def to_str(value): return value.decode(sys.getfilesystemencoding()) def execfile(path, global_dict): """Execute a file""" with open(path, 'r') as f: code = f.read() code = code.replace('\r\n', '\n') + '\n' exec(code, global_dict) else: def to_str(value): return value.encode(sys.getfilesystemencoding()) def log(txt): """Logs fatal errors to a log file if WSGI_LOG env var is defined""" log_file = os.environ.get('WSGI_LOG') if log_file: f = open(log_file, 'a+') try: f.write('%s: %s' % (datetime.datetime.now(), txt)) finally: f.close() ptvsd_secret = os.getenv('WSGI_PTVSD_SECRET') if ptvsd_secret: log('Enabling ptvsd ...\n') try: import ptvsd try: ptvsd.enable_attach(ptvsd_secret) log('ptvsd enabled.\n') except: log('ptvsd.enable_attach failed\n') except ImportError: log('error importing ptvsd.\n') def get_wsgi_handler(handler_name): if not handler_name: raise Exception('WSGI_HANDLER env var must be set') if not isinstance(handler_name, str): handler_name = to_str(handler_name) module_name, _, callable_name = handler_name.rpartition('.') should_call = callable_name.endswith('()') callable_name = callable_name[:-2] if should_call else callable_name name_list = [(callable_name, should_call)] handler = None while module_name: try: handler = __import__(module_name, fromlist=[name_list[0][0]]) for name, should_call in name_list: handler = getattr(handler, name) if should_call: handler = handler() break except ImportError: module_name, _, callable_name = module_name.rpartition('.') should_call = callable_name.endswith('()') callable_name = callable_name[:-2] if should_call else callable_name name_list.insert(0, (callable_name, should_call)) handler = None if handler is None: raise ValueError('"%s" could not be imported' % handler_name) return handler activate_this = os.getenv('WSGI_ALT_VIRTUALENV_ACTIVATE_THIS') if not activate_this: raise Exception('WSGI_ALT_VIRTUALENV_ACTIVATE_THIS is not set') def get_virtualenv_handler(): log('Activating virtualenv with %s\n' % activate_this) execfile(activate_this, dict(__file__=activate_this)) log('Getting handler %s\n' % os.getenv('WSGI_ALT_VIRTUALENV_HANDLER')) handler = get_wsgi_handler(os.getenv('WSGI_ALT_VIRTUALENV_HANDLER')) log('Got handler: %r\n' % handler) return handler def get_venv_handler(): log('Activating venv with executable at %s\n' % activate_this) import site sys.executable = activate_this old_sys_path, sys.path = sys.path, [] site.main() sys.path.insert(0, '') for item in old_sys_path: if item not in sys.path: sys.path.append(item) log('Getting handler %s\n' % os.getenv('WSGI_ALT_VIRTUALENV_HANDLER')) handler = get_wsgi_handler(os.getenv('WSGI_ALT_VIRTUALENV_HANDLER')) log('Got handler: %r\n' % handler) return handler 

ここでブラウザを開き、サイトのアドレスを入力すると動作します。


もう少し


プロジェクトで仮想環境を使用する予定がない場合、 ptvs_virtualenv_proxy.pyを追加しないでください。web.configは次のようになります。


web.config
 <?xml version="1.0" encoding="UTF-8"?> <configuration> <appSettings> <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" /> <add key="PYTHONPATH" value="%APPL_PHYSICAL_PATH%" /> <add key="DJANGO_SETTINGS_MODULE" value="project.settings" /> </appSettings> <system.webServer> <handlers> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python\python.exe|C:\Python\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" /> </handlers> </system.webServer> </configuration> 

また、 IIS で、Djangoだけでなく他のPythonフレームワークにもプロジェクトを展開できます。 主なことは、 web.configの編集を忘れないことです。


あとがき


現在、私たちは作業サイト、開発と改善を手伝ってくれる小さな人々のグループを持っています。 そして、私はあなたと共有したPythonプロジェクトとIISの友情についていくつかの経験を得ました。 それが重宝することを願っています。



Source: https://habr.com/ru/post/J305566/


All Articles