SlideShare a Scribd company logo
1 of 41
Download to read offline
フロントエンジニアでも
py がしたい
2013/03/22
 Tech Lab 3
Agenda
 •お前だれよ
 •python って何よ
 •python の開発環境
 •作ってみる
お前だれよ

 •Yamaguchi Eikichi
 •@__hage__
 •何でも屋 → 4月からフリーランス
 •http://dev.hageee.net
 •python は 2年ちょっと
https://twitter.com/yuchimiri/status/312351688382111745/photo/1
python の特長

  •シンプルな文法
  •最初からオブジェクト指向
  •手続き型みたいな書き方もできる
  •拡張が C/C++ でもかける
  •適当に書いても速い
  •OS の深いところまで触れる
  •最新は 3.3.x 系
  •仕事で使う & 最初の一歩は 2.7.x 系
活躍の場に見境がない python さん
python の文法
python の開発環境
python の開発環境

       •pythonbrew
       •virtualenv, virtualenvwrapper
       •easy_install, pip
       •SublimeText2


※インストール方法は事前資料を参考。
https://gist.github.com/glassesfactory/5192223
pythonbrew

  •システムとは別の python
  •バージョンの切り替え
  •色々入れてくれる
virtualenv, virtualenvwrapper

   •システムとは別のライブラリ環境
   •プロジェクトごとに必要なモジュール
   •virtualenvwrapper でもう少し使いやすく
easy_install, pip

   •ライブラリの管理
   •入れたり消したり、リストをだしたり
   •virtualenv と組み合わせることでプロジェクト環境を作る
モジュールの管理


インストール

$(techlab3) pip install flask




アンインストール

$(techlab3) pip uninstall flask




一覧

$(techlab3) pip freeze
Flask




         MVC のうち、Cに関わる部分をやってくれる。
    非常にシンプルにかけるため、ちょっとした API を構築する時便利。
これぐらい簡単




ルーティングとコントローラーが同時に出来る!


$ (project_name) python main.py

           で、実行してみる
作ってみる
Hello World!

               #!/usr/bin/env python
               # -*- coding: utf-8 -*-

               from flask import Flask


               app = Flask(__name__)


               @app.route('/')
               def index():
                   return "hell world"


               if __name__ == '__main__':
                   app.run()
テンプレート周り

 •jinja2 + pyjade
     jinja2 を jade 形式で記述

 •install
 $(techlab3) pip install pyjade




 •使えるようにする
 app = Flask(__name__)

 app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension')

 @app.route('/'):
     return render_template('index.jade')
書き方

      jade の基本構文




      変数とメソッド
書き方

  ステートメント
テンプレートの継承
  継承元




  拡張
mongodb




            ドキュメント指向データベース。
           RDBMS ではなく NoSQL に分類。



           レコードをテーブルに格納するのではなく
            構造データをJSON形式で表現する。
          構造データの集合体をコレクションと呼ぶ。
mongodb のメリットデメリット

 メリット
  •とても気軽に使える。モックレベルならさくさく。
  •単純なデータの I/O が速い
  •動的にフィールドを追加できる


 デメリット
  •MySQL などと違いデータの型指定が厳密でない
  •柔軟すぎるがゆえに事故が起こる
mongoengine 使おう


インストール

$(techlab3) pip install mongoengine




•フィールドの型指定
•mongodb をちょっと RDBMS の ORM っぽく扱える用になる。
つかってみる
 接続/切断
  from mongoengine import *


  con = connect('db_name')
  con.disconnect()


 モデル
  from datetime import datetime
  from mongoengine import *


  class Tweet(Document):
      sid = SequenceField(unique=True)
      text = StringField(required=True)
      created_at = DateTimeField(default=datetime.now)
      updated_at = DateTimeField(default=datetime.now)
つかってみる


新規作成                          取得
 #保存                           #コレクション取得
 tweet = Tweet(text='hage')    for tweet in Tweet.objects():
 tweet.save()                      logging.info(tweet.text)




更新                            削除

 hironori.text = 'boorin'      hironori.delete()
 hironori.save()
ちょっとチュートリアルっぽく
モデル定義




 from datetime import datetime
 from mongoengine import *


 class Tweet(Document):
     sid = SequenceField(unique=True)
     text = StringField(required=True)
     created_at = DateTimeField(default=datetime.now)
     updated_at = DateTimeField(default=datetime.now)
model.py


    •Tweet モデルを書く
    •db とのコネクションを管理する DBI を書く
ルーティング

  単純な CRUD を実装する上で
  以下のようなルーティングを定義する。



         •一覧 => / [GET]
         •詳細 => /1, /2, /3... [GET]
         •新規 => /new [GET]
         •保存 => / [POST]
         •更新 => / [PUT]
         •削除 => / [DELETE]
リクエストタイプに応じたレスポンス
   json を要求されたら json を返す。
   そうでなければ HTML を返す
   →レスポンスのファイルタイプが異なるだけで
     ほとんどの処理が同じになる場合が多いため。



  @app.route('/index.json', method=["GET"])
  @app.route('/', method=["GET"])
  def index():
      #リクエストが json だったら
      if request.headers['Content-Type'] ==
  'application/json':
          return #json 返す
      else:
          #そうでなければ html を返す。
          return render_template('index.jade')
db から引っ張り上げる
  事前に定義した DBI を使って
  mongodb との接続を確立しつつ、データをひっぱる。



      from model import db, Tweet

      with db:
          collection = Tweet.objects.all()
データの整形
  mongodb からのデータを
  そのまま json にしようとするといくつかのデータは型が
  存在しないと怒られるので整形する。


 def model_serializer(model):
     result = {}
     for k in model:
         val = model[k]
         if isinstance(val, (str, basestring, int, float)):
             result.setdefault(k, val)
         elif isinstance(val, list):
             l = [model_serializer(v) for v in val]
             result.setdefault(k, l)
         elif isinstance(val, dict):
             result.setdefault(k, model_serializer(val))
         elif isinstance(val, datetime):
             result.setdefault(k, val.strftime('%Y/%m/%d %H:%M:%S'))
         elif isinstance(val, Document):
             result.setdefault(k, model_serializer(val))
         elif isinstance(val, ObjectId):
             result.setdefault(k, str(val))
     return result
json にして返す
   python には 2.6 からデフォルトで
   json のパーサーが備わっているため
   特に細かいことを気にする必要はない。




          import json
          json.dumps({'hoge':'huga'})
データの保存

 フォームからのデータを引っ張ってきて
 モデルへ突っ込んで保存する。


  @app.route('/create', methods=["POST"])
  def create():
      data = request.form
      tweet = Tweet(text=data["text"])
      try:
           tweet.save()
      except Exception:
           print e
      serialized = modelSerializer(tweet)
      resData = json.dumps(serialized)
      return Response(resData, content_type="application/json",
  status=200)
データの削除




 @app.route('/<int:id>', methods=["DELETE"])
 def destroy(id):
     with db:
         try:
              tweet = Tweet.objects(sid=id).first().delete()
              datas = json.dumps({'id': tweet.sid})
         except:
              # raise
     return Response(datas, mimetype="application/json", status=200)
データの更新


  @app.route('/<int:id>', methods=["PUT"])
  def update(id):
      data = request.form
      with db:
          tweet = Tweet.objects(sid=id).first()
          tweet.text = data['text']
          tweet.updated_at = datetime.now()
          try:
               tweet.save()
          except Exception, e:
               print e
      serialized = model_serializer(tweet)
      resData = json.dumps(serialized)
      return Response(resData, mimetype="application/json", status=200)
オススメの本
オススメの本

More Related Content

What's hot

Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoTsuyoshi Yamamoto
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~Akabane Hiroyuki
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Satoshi Suzuki
 
XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3Hikawa Kilica
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Takashi J OZAKI
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02Yusuke Ando
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法regret raym
 
Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Toshiki NOGUCHI
 
MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略ippei_suzuki
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能hitode909
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディングAkihiro Okuno
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo dbYuji Isobe
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 

What's hot (20)

Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
mishimasyk#4
mishimasyk#4mishimasyk#4
mishimasyk#4
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
 
XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法
 
Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014
 
MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略
 
Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディング
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 

Viewers also liked

Recipes by bulgarian team
Recipes by bulgarian teamRecipes by bulgarian team
Recipes by bulgarian teamMehmet BOLAT
 
Geleceğimiz için güvenli internet!
Geleceğimiz için güvenli internet!Geleceğimiz için güvenli internet!
Geleceğimiz için güvenli internet!Mehmet BOLAT
 
Balkan boşnak recipes
Balkan boşnak recipesBalkan boşnak recipes
Balkan boşnak recipesMehmet BOLAT
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathologySummer Tassin
 
Erdoğan şahinoğlu secondary school
Erdoğan şahinoğlu secondary schoolErdoğan şahinoğlu secondary school
Erdoğan şahinoğlu secondary schoolMehmet BOLAT
 
Dishes typical of  Bulgarian national cooking
Dishes typical of  Bulgarian national cookingDishes typical of  Bulgarian national cooking
Dishes typical of  Bulgarian national cookingMehmet BOLAT
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathologySummer Tassin
 
Ispanya presentations
Ispanya presentationsIspanya presentations
Ispanya presentationsMehmet BOLAT
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathologySummer Tassin
 
1. Essential Selling Skills For Slide Share Part 1
1. Essential Selling Skills For Slide Share Part 11. Essential Selling Skills For Slide Share Part 1
1. Essential Selling Skills For Slide Share Part 1Mohammad Khaleque (Mak)
 

Viewers also liked (17)

てらこ201104
てらこ201104てらこ201104
てらこ201104
 
Recipes by bulgarian team
Recipes by bulgarian teamRecipes by bulgarian team
Recipes by bulgarian team
 
Geleceğimiz için güvenli internet!
Geleceğimiz için güvenli internet!Geleceğimiz için güvenli internet!
Geleceğimiz için güvenli internet!
 
Presentación1
Presentación1Presentación1
Presentación1
 
Balkan boşnak recipes
Balkan boşnak recipesBalkan boşnak recipes
Balkan boşnak recipes
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathology
 
Potato salad
Potato saladPotato salad
Potato salad
 
Erdoğan şahinoğlu secondary school
Erdoğan şahinoğlu secondary schoolErdoğan şahinoğlu secondary school
Erdoğan şahinoğlu secondary school
 
Essential Selling Skills Part Iv
Essential Selling Skills   Part IvEssential Selling Skills   Part Iv
Essential Selling Skills Part Iv
 
Essential Selling Skills Part Iii
Essential Selling Skills   Part IiiEssential Selling Skills   Part Iii
Essential Selling Skills Part Iii
 
Dishes typical of  Bulgarian national cooking
Dishes typical of  Bulgarian national cookingDishes typical of  Bulgarian national cooking
Dishes typical of  Bulgarian national cooking
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathology
 
Ispanya presentations
Ispanya presentationsIspanya presentations
Ispanya presentations
 
Social media and speech pathology
Social media and speech pathologySocial media and speech pathology
Social media and speech pathology
 
Essential Selling Skills Part Ii
Essential Selling Skills   Part IiEssential Selling Skills   Part Ii
Essential Selling Skills Part Ii
 
Adana slide
Adana slideAdana slide
Adana slide
 
1. Essential Selling Skills For Slide Share Part 1
1. Essential Selling Skills For Slide Share Part 11. Essential Selling Skills For Slide Share Part 1
1. Essential Selling Skills For Slide Share Part 1
 

Similar to Teclab3

Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)Ryuma Tsukano
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことdcubeio
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングkunihikokaneko1
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applicationstotty jp
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るMatsuo Keita
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へDevelopers Summit
 

Similar to Teclab3 (20)

Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作る
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ
 

Teclab3

  • 2. Agenda •お前だれよ •python って何よ •python の開発環境 •作ってみる
  • 3. お前だれよ •Yamaguchi Eikichi •@__hage__ •何でも屋 → 4月からフリーランス •http://dev.hageee.net •python は 2年ちょっと
  • 4.
  • 6. python の特長 •シンプルな文法 •最初からオブジェクト指向 •手続き型みたいな書き方もできる •拡張が C/C++ でもかける •適当に書いても速い •OS の深いところまで触れる •最新は 3.3.x 系 •仕事で使う & 最初の一歩は 2.7.x 系
  • 10. python の開発環境 •pythonbrew •virtualenv, virtualenvwrapper •easy_install, pip •SublimeText2 ※インストール方法は事前資料を参考。 https://gist.github.com/glassesfactory/5192223
  • 11. pythonbrew •システムとは別の python •バージョンの切り替え •色々入れてくれる
  • 12. virtualenv, virtualenvwrapper •システムとは別のライブラリ環境 •プロジェクトごとに必要なモジュール •virtualenvwrapper でもう少し使いやすく
  • 13. easy_install, pip •ライブラリの管理 •入れたり消したり、リストをだしたり •virtualenv と組み合わせることでプロジェクト環境を作る
  • 14. モジュールの管理 インストール $(techlab3) pip install flask アンインストール $(techlab3) pip uninstall flask 一覧 $(techlab3) pip freeze
  • 15. Flask MVC のうち、Cに関わる部分をやってくれる。 非常にシンプルにかけるため、ちょっとした API を構築する時便利。
  • 18. Hello World! #!/usr/bin/env python # -*- coding: utf-8 -*- from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "hell world" if __name__ == '__main__': app.run()
  • 19. テンプレート周り •jinja2 + pyjade jinja2 を jade 形式で記述 •install $(techlab3) pip install pyjade •使えるようにする app = Flask(__name__) app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension') @app.route('/'): return render_template('index.jade')
  • 20. 書き方 jade の基本構文 変数とメソッド
  • 23. mongodb ドキュメント指向データベース。 RDBMS ではなく NoSQL に分類。 レコードをテーブルに格納するのではなく 構造データをJSON形式で表現する。 構造データの集合体をコレクションと呼ぶ。
  • 24. mongodb のメリットデメリット メリット •とても気軽に使える。モックレベルならさくさく。 •単純なデータの I/O が速い •動的にフィールドを追加できる デメリット •MySQL などと違いデータの型指定が厳密でない •柔軟すぎるがゆえに事故が起こる
  • 25. mongoengine 使おう インストール $(techlab3) pip install mongoengine •フィールドの型指定 •mongodb をちょっと RDBMS の ORM っぽく扱える用になる。
  • 26. つかってみる 接続/切断 from mongoengine import * con = connect('db_name') con.disconnect() モデル from datetime import datetime from mongoengine import * class Tweet(Document): sid = SequenceField(unique=True) text = StringField(required=True) created_at = DateTimeField(default=datetime.now) updated_at = DateTimeField(default=datetime.now)
  • 27. つかってみる 新規作成 取得 #保存 #コレクション取得 tweet = Tweet(text='hage') for tweet in Tweet.objects(): tweet.save() logging.info(tweet.text) 更新 削除 hironori.text = 'boorin' hironori.delete() hironori.save()
  • 29. モデル定義 from datetime import datetime from mongoengine import * class Tweet(Document): sid = SequenceField(unique=True) text = StringField(required=True) created_at = DateTimeField(default=datetime.now) updated_at = DateTimeField(default=datetime.now)
  • 30. model.py •Tweet モデルを書く •db とのコネクションを管理する DBI を書く
  • 31. ルーティング 単純な CRUD を実装する上で 以下のようなルーティングを定義する。 •一覧 => / [GET] •詳細 => /1, /2, /3... [GET] •新規 => /new [GET] •保存 => / [POST] •更新 => / [PUT] •削除 => / [DELETE]
  • 32. リクエストタイプに応じたレスポンス json を要求されたら json を返す。 そうでなければ HTML を返す →レスポンスのファイルタイプが異なるだけで ほとんどの処理が同じになる場合が多いため。 @app.route('/index.json', method=["GET"]) @app.route('/', method=["GET"]) def index(): #リクエストが json だったら if request.headers['Content-Type'] == 'application/json': return #json 返す else: #そうでなければ html を返す。 return render_template('index.jade')
  • 33. db から引っ張り上げる 事前に定義した DBI を使って mongodb との接続を確立しつつ、データをひっぱる。 from model import db, Tweet with db: collection = Tweet.objects.all()
  • 34. データの整形 mongodb からのデータを そのまま json にしようとするといくつかのデータは型が 存在しないと怒られるので整形する。 def model_serializer(model): result = {} for k in model: val = model[k] if isinstance(val, (str, basestring, int, float)): result.setdefault(k, val) elif isinstance(val, list): l = [model_serializer(v) for v in val] result.setdefault(k, l) elif isinstance(val, dict): result.setdefault(k, model_serializer(val)) elif isinstance(val, datetime): result.setdefault(k, val.strftime('%Y/%m/%d %H:%M:%S')) elif isinstance(val, Document): result.setdefault(k, model_serializer(val)) elif isinstance(val, ObjectId): result.setdefault(k, str(val)) return result
  • 35. json にして返す python には 2.6 からデフォルトで json のパーサーが備わっているため 特に細かいことを気にする必要はない。 import json json.dumps({'hoge':'huga'})
  • 36. データの保存 フォームからのデータを引っ張ってきて モデルへ突っ込んで保存する。 @app.route('/create', methods=["POST"]) def create(): data = request.form tweet = Tweet(text=data["text"]) try: tweet.save() except Exception: print e serialized = modelSerializer(tweet) resData = json.dumps(serialized) return Response(resData, content_type="application/json", status=200)
  • 37. データの削除 @app.route('/<int:id>', methods=["DELETE"]) def destroy(id): with db: try: tweet = Tweet.objects(sid=id).first().delete() datas = json.dumps({'id': tweet.sid}) except: # raise return Response(datas, mimetype="application/json", status=200)
  • 38. データの更新 @app.route('/<int:id>', methods=["PUT"]) def update(id): data = request.form with db: tweet = Tweet.objects(sid=id).first() tweet.text = data['text'] tweet.updated_at = datetime.now() try: tweet.save() except Exception, e: print e serialized = model_serializer(tweet) resData = json.dumps(serialized) return Response(resData, mimetype="application/json", status=200)
  • 39.