LoginSignup
6
4

More than 5 years have passed since last update.

Pyramid(Pythonのwebフレームワーク)メモ

Last updated at Posted at 2018-10-20

Pyramid始めました。ので、設定メモ。

URLの設定

基本的なrouteの使い方

configの設定

if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('ルートの名前', 'urlの指定')  # ルートの追加
        config.scan()  # 確定

呼ばれる関数

@view_config(route_name='ルートの名前', renderer='json')
def 適当な関数名(request):
    処理
    return {}  # rendererにjsonを設定しておくとオブジェクトがそのまま返せる

API的なrouteの使い方

configの設定時に{}でパラメータの受取を設定することができる。よくある /users/user_id/login とかにアクセスした時に、user_idとloginの部分を受け取るようにするには、

if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('ルートの名前', '/users/{id}{func:.*}')
        config.scan()  # 確定

としておく。user_idの部分がidに、/loginがfuncに設定される。呼ばれる関数側では、requestオブジェクトのmatchdictを参照すれば値を取得できる。

@view_config(route_name='ルートの名前', renderer='json')
def 適当な関数名(request):
    if(request.matchdict["func"] == "/login"):
        /users/user_id/loginのuser_idの部分で指定されてたユーザーのログイン処理を行う
        user_idはurlの{id}という設定によりrequest.matchdict["id"]に格納されている

    elif(request.matchdict["func"] == ""):
        url呼び出し時に/users/user_idとした場合funcが空なので例えばRESTであればGETの処理を行う

    return {}  # rendererにjsonを設定しておくとオブジェクトがそのまま返せる

routeで呼び出す関数(@view_configがついた関数)を別モジュールに置きたい

関数があるモジュール内でconfig.scan()を呼ぶ。

でも面倒くさいんで、たぶんモジュール内の@view_configとっぱらってメインモジュールでこう書いちゃう(:3」∠)

# const/const_map.py内のconst_map関数を呼び出す
sys.path.append("const")
from const_map import *

@view_config(route_name='const_map', renderer='json')
def call_const_map(request):
    return const_map(request)

静的ファイル配信

デバッグ用の静的ファイル配信機能を持っている

if __name__ == '__main__':
    with Configurator() as config:
        config.add_static_view(name='アクセスURL', path='公開するディレクトリ指定。相対パスも可')

pyramid-mongoengineの使い方

configの設定

pcreateを使ってなくてiniファイル群が無い場合(1ファイルスタート)、マニュアル読んでもiniに設定しろとしか書いてなくてどうすればいいのかと(´・ω・`)
configにmongo_urlとmongodb_nameを設定すればOK。

if __name__ == '__main__':
    with Configurator() as config:
        config.add_settings({
            "mongo_url": "mongodb://ホストのurl[:ポート(省略可)]",
            "mongodb_name": "使用するDB名",
        })
        config.include("pyramid_mongoengine")
        config.add_connection_database()

使い方

コレクションアクセス用クラス

MogoEngineのインスタンスを作っておき、それを使ってクラスを構築する。クラス名はmongodbのコレクション名に対応するので、適当につけてはいけない。UserEventとかクラス名につけると、user_eventというコレクションにアクセスできる。

フィールドの型はバリデーションに使われる。型の一覧はこちら
http://docs.mongoengine.org/guide/defining-documents.html#fields

db = MongoEngine()

class クラス名(db.Document):
    フィールド名 = db.フィールドの型(required=True)

メソッドの使用

MongoEngineは素のMongoDBと書式に少し違いがあるので注意。例えばMongoDBで

    .update({"$set": {"value": value}})

と値をupdateする場合、MongoEngineでは

    .update(set__value=value)

と$setをset__と書いたりする。

クエリ

コレクションのリストを取得するには

コレクション用クラス.objects(フィルタ)

とすると、コレクション用クラスのインスタンスのリスト(カーソル)が返る。rendererにjsonが指定してあると、このカーソルをそのままreturnできる。

ひとつだけ取り出すには、

.first()

を使用する。コレクション用クラスのインスタンスが取得できるので、returnでクライアントに送信したり、加工して.save()したり、コレクション用クラスに書いたメソッドを実行したりできる。結果リストが空の場合はNoneが返る。

JSON文字列化

クエリ結果は

.to_json()

で、JSON文字列を取得できる。print()でデバッグするときとかに便利。

受け取ったデータから_idを除外

クエリ結果に

.exclude("id")

を付ける。

セッション

cookie

# import
from pyramid.session import SignedCookieSessionFactory

# config設定
session_factory = SignedCookieSessionFactory('シークレット文字列')
config.set_session_factory(session_factory)

設定してあるとレスポンスヘッダに

Set-Cookie: session=文字列;

が設定される。でも普通cookieセッションとか使わんよね?(:3」∠)

pyramid-beaker

セッションIDだけCookieでやり取りして、実体はサーバが持ってるっていうのをやるのに便利なライブラリ。設定してあるとレスポンスヘッダに

Set-Cookie:  beaker.session.id=文字列;

が設定される。

memoryセッション

個人的にはmemoryセッションが後腐れなくて好きです。まぁ、実運用だとメモリがもったいないので開発時専用ですが。

config.add_settings({
    "session.type": "memory",
    "session.cookie_expires": True,
})
config.include('pyramid_beaker')

mongodbセッション

セッション情報をmongodbに保存する。指定したDBの中にbacker_cacheというコレクションが作られてそこにデータが保存される。実運用用。

高速にさばきたいならext:memcachedとかでどうぞ。

config.add_settings({
    'session.type': 'ext:mongodb',
    'session.url': 'mongodb://ホスト名:ポート名/DB名',
})
config.include('pyramid_beaker')

入出力

ルータで呼ばれる関数のrequestオブジェクトのsessionで読み書き

request.session["名前"] = 
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4