Turbogears-using-mongodb

提供:Dev Guides
移動先:案内検索

TurboGears-MongoDBの使用

TurboGearsは、MongoDBドキュメントデータベースもサポートしています。 オブジェクトドキュメントマッパーAPIであるMing​​を使用します。 Mingの使用法はSQLAlchemyと非常によく似ています。 Mingクエリ言語により、SQLAlchemyベースのTurboGearsプロジェクトをMingに移植できます。

PyMongoとは

PyMongoは、MongoDBを操作するためのツールを含むPythonディストリビューションです。 MingはPyMongoを拡張して以下を提供します-

  • 宣言的モデル
  • スキーマの検証と変換
  • スキーマの進化
  • 純粋なInMemory MongoDBの実装
  • 作業単位
  • アイデンティティマップ
  • 1対多、多対1および多対多の関係

まず、MongoDBをダウンロードしてインストールする必要があります。 MongoDBの最新のディストリビューションは、https://www.mongodb.org/downloads#production [https://www.mongodb.org/downloads]からダウンロードできます。

Windowsでは、-dbpathオプションを指定してMongoDBサーバーを起動します-

C:\mongodb\bin>Mongod --dbpath d:\mongo
*D:\ mongo folder* は、MongoDBデータベースを保存するために指定されています。 サーバーは* http://localhost:27017でリッスンを開始します。* MongoDBシェルを開始するには、次のコマンドを使用します-
C:\mongodb\bin>Mongo

これで、MongoDB環境の準備が整いました。

-mingオプションを使用してTurboGearsプロジェクトを作成します-

gearbox quickstart --ming Hello

このクイックスタートプロジェクトは、SQLAlchemyバージョン用に提供されているような認証および承認レイヤーを提供します。 このアプリケーションは、ローカルマシンのポート27017でサーバーに接続しようとします。 プロジェクトフォルダ内のdevelopment.iniファイルには、次の設定が含まれています-

ming.url = mongodb://localhost:27017/
ming.db = hello

次のコマンドを使用してプロジェクトを設定します-

Python setup.py develop

プロジェクトフォルダには、次のファイルを持つモデルサブフォルダが含まれています-

  • _ init。py_ -これは、*データベース*アクセスが設定される場所です。 コレクションを*このモジュールにインポート*する必要があります。 たとえば、このパッケージに学生コレクションを追加します。
  • session.py -このファイルは、データベース接続のセッションを定義します*。 クエリを実行するセッションを指定するために *MappedClass を宣言する必要があるたびに、これをインポートする必要があります。
  • auth.py -クイックスタートで認証と承認*を有効にしている場合、このファイルが作成されます。 これは、3つのコレクション repoze .whoを定義します。これは、ユーザー、グループ、および許可にさらに依存します。

コレクションを定義する

デフォルトでは、TurboGearsはMingを宣言モードで構成します。 これは、SQLAlchemyの宣言サポートに似ており、MappedClassクラスから継承する各モデルが必要です。

MappedClassでは、mongometaサブクラスが内部で使用可能である必要があります。これにより、ドキュメントを保存するコレクションの名前とドキュメントの保存に使用されるセッションに関する詳細が提供されます。

MappedClassには、ドキュメント内のフィールドの定義も含まれています。 Mingのodmモジュールには、さまざまなタイプのフィールドプロパティの定義があります-

  • FieldProperty
  • ForeignIdProperty
  • RelationProperty
  • ming.schemaモジュール*は、次のデータ型を定義します-
  • ming.schema.Anything
  • ming.schema.Array
  • ming.schema.Binary
  • ming.schema.Bool
  • ming.schema.Float
  • ming.schema.Int
  • ming.schema.ObjectId
  • ming.schema.Scalar
  • ming.schema.String

このモデルに生徒のコレクションを追加するには、hello/modelsフォルダーに次のコードをstudent.pyとして保存します。

Hello \ models \ student.py

from ming import schema
from ming.odm import MappedClass
from ming.odm import FieldProperty, ForeignIdProperty
from hello.model import DBSession

Class student(MappedClass):
   class __mongometa__:
      session = DBSession
      name = 'student'

   _id = FieldProperty(schema.ObjectId)
   name = FieldProperty(schema.String(required = True))
   city = FieldProperty(schema.String(if_missing = ''))
   address = FieldProperty(schema.String(if_missing = ''))
   pincode = FieldProperty(schema.String(if_missing = ''))

最後に、このモデルをhello \ models \ init.pyに含めます

# Import your model modules here.
from hello.model.auth import User, Group, Permission
from hello.model.student import student

これらのモデルをセットアップするには、次のギアボックスコマンドを実行します-

Gearbox setup-app

次のギアボックスコマンドでサーバーを起動します-

Gearbox serve –reload –debug

このアプリケーションのホームページ*(http://localhost:8080/)*を開き、マネージャーの資格情報でログインします。 このアプリケーションの管理ページには、セットアップされたモデルのリストが表示されます。 (マネージャーとしてログイン、パスワードmanagepass)

ホームページアプリケーション

コレクションの作成は、MongoDB WebインターフェイスとMongoDBシェルでも確認できます。

ODMSessionは、次の機能を使用していくつかのデータベース操作を実行するために使用されます-

  • model.query.find()
  • model.query.find_and_modify()
  • model.remove()
  • model.update() *model.flush()

ToscoWidgetフォームの設計

ToscoWidgetフォームを設計して、学生データを入力し、学生モデルの基礎となるテーブルに追加します。

以下は、studentform.pyを作成するためのコードです-

Hello \ controllers \ studentform.py

import tw2.core as twc
import tw2.forms as twf

class StudentForm(twf.Form):

   class child(twf.TableLayout):
      name = twf.TextField(size = 20)
      city = twf.TextField()
      address = twf.TextArea("",rows = 5, cols = 30)
      pincode = twf.NumberField()

   action = '/save_record'
   submit = twf.SubmitButton(value = 'Submit')

add()関数を呼び出すアプリケーションのRootcontroller '/add' URLで、ブラウザーで上記の設計されたフォームを開きます。 次に、その送信ボタンはsave_record()関数を呼び出します。 フォームデータを取得し、それを学生テーブルに保存し、アプリケーションを '/listrec' URLにリダイレクトします。これにより、studentlistテンプレートが公開されます。

このアクティビティのroot.pyは次のとおりです-

こんにちは/controllers/root.py

from hello.lib.base import BaseController
from tg import expose, flash, redirect, request,url, lurl
from tg import redirect, validate
from hello import model
from hello.model import DBSession
from hello.model.student import student

from hello.controllers.studentform import StudentForm

class RootController(BaseController):
   @expose()
   def index(self):
      return "<h1>Hello World</h1>"

   @expose ("hello.templates.studentlist")
   def listrec(self):
      entries = student.query.find()
      return dict(entries = entries)

   @expose('hello.templates.studentform')
   def add(self,* args, **kw):
      return dict(page = 'studentform', form = StudentForm)

   @expose()
   def save_record(self, **kw):
      newstudent = student(name = kw['name'],city = kw['city'],
         address = kw['address'], pincode = kw['pincode'])
      DBSession.flush()
      flash(message = "new entry added successfully")
      redirect("/listrec")

次のテンプレートがテンプレートフォルダに作成されます-

こんにちは\テンプレート\学生フォーム

<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
   xmlns:py = "http://genshi.edgewall.org/" lang = "en">

   <head>
      <title>Student Registration Form</title>
   </head>


   <body>
      <div id = "getting_started">
         ${form.display(value = dict(title = 'Enter data'))}
      </div>
   </body>

</html>

Hello \ templates \ studentlistl

<html xmlns = "http://www.w3.org/1999/xhtml"
   xmlns:py = "http://genshi.edgewall.org/">

   <head>
      <link rel = "stylesheet" type = "text/css" media = "screen"
         href = ${tg.url('/css/style.css')}"/>
      <title>Welcome to TurboGears</title>
   </head>

   <body>
      <h1>Welcome to TurboGears</h1>

      <py:with vars = "flash = tg.flash_obj.render('flash', use_js = False)">
         <div py:if = "flash" py:replace = "Markup(flash)"/>
      </py:with>

      <h2>Current Entries</h2>

      <table border = '1'>
         <thead>
            <tr>
               <th>Name</th>
               <th>City</th>
               <th>Address</th>
               <th>Pincode</th>
            </tr>
         </thead>

         <tbody>
            <py:for each = "entry in entries">
               <tr>
                  <td>${entry.name}</td>
                  <td>${entry.city}</td>
                  <td>${entry.address}</td>
                  <td>${entry.pincode}</td>
               </tr>
            </py:for>
         </tbody>
      </table>

   </body>

</html>

サーバーを再起動し、ブラウザに http://localhost:8080/add と入力します-

学生登録フォーム

データが追加され、送信ボタンが押されるたびに、現在のエントリのリストが表示されます。

新しいエントリ出力