[Python] DjangoでのWeb構築からリリースまで(1)




目標

本ポスティングは、PythonでWebを構築するようになったきっかけやDjangoフレームワークを活用して配布および運営した事項について整理します。




目次

  1. PythonでのWeb構築を考慮した理由
  2. PythonでWebを構築する際持つリスク
  3. Python Web Framework 「Django」
  4. Application構成について(Url管理等)
  5. View&Templateについて
  6. 整理




1. PythonでのWeb構築を考慮した理由

  • データ処理に関するライブラリーに大きなメリットがあります。
    :Pandas、Numpy、Tensorflow、Scrapy、Matplotlibなど
  • コードプロファイルのモジュールを内蔵しており、全体実行時間や関数の動作時間を測定することにメリットがあります。
  • 信頼できる有用なフレームワークがたくさんあります。
    :Django、Flaskなど
  • 内・外部ライブラリのパッケージ管理に強いです。
    :開発-ステージング-リリース環境に必要なそれぞれのライブラリ名又はバージョンについてリストアップして管理することができます。
  • 他の言語との互換性が優れています。
    ①Cpython/IronPython
    :Cpythonの場合、C関数を直接呼び出してPythonに使用するのができます。療両方全部.NETフレームワークでpandasやnumpyなどデータ処理ライブラリを呼び出すときによく使います。
    ②Jython
    :Why use Jython when you could just use Java?[closed]
    (要約すると、堅固なJavaを簡潔なPythonのコードで使えるという点だが様々な意見がある)
  • 他の言語に比べてさらに明確して可読性が良くて、悩むことを減ることができます。
    :Pythonでは配列のためのメモリの割当、メモリー整列、CPUでデータを送る手順などを検討する必要がありません。(この部分が本当に魅力的なんですが、下記の短所で見られるようにパフォーマンスに対して多くの部分を放棄しなければなりません。)




2. PythonでWebを構築する際持つリスク

  • CPUのパフォーマンスが大事な作業を処理する際、複数のプロセス処理に対する支援が不足します。 基本的にシングルスレッドの言語なので、並列処理のため別のモジュールを適用する必要があります。
  • 他の言語に比べてパフォーマンスに対して損害あるためにメモリーを活用しなければならない作業には他の言語を選択したほうが良いと思います。
  • Javaと一緒に他の言語に比べて、熟練されたPythonウェブ開発者が少ないです。




3. Python Web Framework 「Django」


Pythonでウェブを作成するために使われるフレームワークには、ジャンゴ(Django)とフラスコ(Flask)があります。この中で本ポストではDjangoについて説明します。

  • Djangoはプロトタイプを素早く作成するのに特なので、エジャイル開発方式に有利です。 基本的に下記の3つを提供します。

    ①Adminページおよびアカウント管理やセッション管理機能
    ②DBのバインド
    ③開発用内蔵サーバー

    ウェブ作成初期には多くの修正事項が発生して、基本仕様および構成が変更される状況が良く発生します。 Djangoの場合、基本管理ページでセッション機能をテストすることなどができます。 だけでなく、Django Modelの操作で多くのデータベースを共通形式で基本操作(CURD)ができます。 また、開発用の内蔵ウェブサーバを提供します。 商用サーバの設定無しで、ウェブを作成することができます。
  • 堅固な作業のためには、別のモジュールを活用し、それぞれのデータベースと連結すべきず、リリース前にはセキュリティのために内臓サーバではなく、独立的なサーバを構築する必要があります。

    しかし、上記の3つの特徴は初期スタートが速くて、ウェブの作成に優しく接近することができます。




4. Application構成について(Url管理等)

mysite/
  manage.py
  mysite/
    __init__.py
    settings.py
    urls.py
    wsgi.py
  polls/
    __init__.py
    admin.py
    apps.py
  migrations/
     __init__.py
    0001_initial.py
  models.py
  static/
    polls/
     images/
       background.gif
     style.css
  templates/
    polls/
      detail.html
      index.html
      results.html
  tests.py
  urls.py
  views.py
templates/
  admin/
    base_site.html
  • manage.py
    :プロジェクトとの相互作用のためのコマンドラインのユーティリティで、プロジェクト構築の時に自動生成されます。

    ① startproject
    ② runserver
    ③ makemigrations
    ④ migrate
    ⑤ collectstatic
  • settings.py
    :プロジェクトの環境および構成を保存します。(7番で詳しく説明)

    ① ALLOWED_HOST
    ② DATABASE
    ③ INSTALLED_APP
    ④ MEDIA_URL
    ⑤ STATIC_DIR
    ⑥ DEBUG

    ⑦ SECRET_KEY
  • urls.py
    :アプリケーションでユーザーからのURL入力がある時、どのページを見せてくれるかについて整理し、URLと一致するviewを探すためのパターンを集めておきます。
  • wsgi.py
    :WSGI(Web Server Gateway Interface)
    Pythonで作成したアプリケーションがウェブサーバと通信するために作成されるミドルウェアです。WSGIサーバはアプリケーションのサーバに対するパスを読み込んで、コードを呼び出します。
  • migrations
    :データベースに必要なテーブルを作りながら、適用される各migrationの情報を表示して、モデル(及びDBスキーマ)に対する変更事項を保存します。 (6番のModelについて参照)
  • static
    :ウェブを構築する時作成するJavascriptまたはCSS、イメージなどのファイルを管理するディレクトリです。
  • templates
    :Djangoは、ウェブフレームワークなので、HTMLを動的に生成することになります。 この時、開発者がテンプレートに望むHTMLに関するコードを作成します。この作成されたものがtemplateディレクトリから管理されます。




5.View&Template

  • View

DjangoではクライアントからRequestを受けてResponseをリターンする方法でView関数を使います。クライアントに渡すリスポンスは、HTMLページ自体がなる時もあり、リディレクションredirection渡す時もあり、ミスなどをリターンする時もあります。 

したがって、Viewには、クライアントにResponseをリターンする際に必要なロジックを含まれます。Viewに作成したコードはPython環境の下にあれば、どこでも再使用ができます。

  • Template

動的にHtmlを生成するための言語とロジックを担当するviewの言語をきれいに分けるために’テンプレート言語’というミニ言語を使用します。
このテンプレート言語で、テンプレートをロードおよびレンダリングすることがバックエンドと関係なくできます。

テンプレートAPIについてはloadとrenderingがあります。loadは、与えられた識別子についたテンプレートを探して事前処理をします。renderingはコンテキストcontextデータから探したテンプレートを保管して、持ってきたデータを文字列の形でリターンします。




6.まとめ

Pythonはデータ処理に関するライブラリが多様で、信頼度が高いフレームワークを活用することができるし、また、ウェブをアジャイル方式で構築する状況に得意です。 また、環境別にパッケージの管理がよくできるので、リリースの時にもミスを防ぐことができます。

しかし、性能については苦手があるのでパフォーマンスに対する別の処理が必要です。

Djangoではコマンドラインユーティリティでプロジェクトを生成してサーバーを回しながら、View・Temlate・Model・Staticなどを通じてクライアントとバックエンドを区別し、動的にページを生成します。

次のポスティングでは環境に関する設定ファイル、サーバ構築時に必要なWSGIなどについてポスティングをしたいと思います。