ããã§ã¯ãAPIãŸãã¯æšå¥šäºé ãéžæããã¢ã«ãŽãªãºã ãšã®ããåãã®è€éãã«ã€ããŠã¯èª¬æããŸããã ããã«ã€ããŠ-å€åã次ã®èšäºã§ã ãã®èšäºã§ã¯ãPythonãšFlaskã䜿çšããŠãGoogle App Engineãã©ãããã©ãŒã ã§ã¢ããªã±ãŒã·ã§ã³ãäœæãæ§æããããã€ããããã»ã¹ã®ã¿ã説æããŸãã
ã¿ã€ããã¹ãäžæ£ç¢ºãã«ã€ããŠã¯ãååŸã«ãç¥ãããã ããã ããããšã
ããã§ã¯å§ããŸãããã appengine.google.comã«ã¢ã¯ã»ã¹ããŸãã ããã§ããŸã èªèšŒãããŠããªãå Žåã¯ãGoogleã¢ã«ãŠã³ãã®ãŠãŒã¶ãŒå/ãã¹ã¯ãŒããå ¥åããããæ±ããããŸãã
èªèšŒã«æåãããšããã¢ããªã±ãŒã·ã§ã³ã®äœæããã¿ã³ïŒãŸãã¯ã¢ããªã±ãŒã·ã§ã³ãããå Žåã¯ã¢ããªã±ãŒã·ã§ã³ã®ãªã¹ãïŒã衚瀺ãããŸãã ç§ã®ç¥ãéããè¿œå ã®æè³ãããã«ãGoogleã¯æ倧25åã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸãïŒééã£ãŠããå Žåã¯æ£ããïŒã ä»ã®ã¯ã©ãŒã¿ã®ãªã¹ãã¯ã ãªã³ã¯ãã¯ãªãã¯ããŠèŠã€ããããšãã§ããŸãã
ãã¿ã³ãã¯ãªãã¯ãããšãã¢ããªã±ãŒã·ã§ã³èå¥åïŒãŸã ããžãŒã§ã¯ãªãïŒãšååãããã³èªèšŒãªãã·ã§ã³ãéžæã§ãããã©ãŒã ã衚瀺ãããŸãã å©çšèŠçŽã«åæãããã¿ã³ãæŒããŠæåã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã äœæããããããçš®ã®åã³ã ã¢ããªã±ãŒã·ã§ã³ã¯httpïŒ// [identifier] .appspot.comã§å©çšå¯èœã«ãªããŸãããããã§ã identifierã¯äžæã®ã¢ããªã±ãŒã·ã§ã³IDã§ãã ã¢ããªã±ãŒã·ã§ã³ã¯äœ¿çšå¯èœã§ããããã¡ããåäœããŸãã-åäœãããã®ã¯äœããããŸããã ç¶æ³ãä¿®æ£ããŠãã ããã
å¿ èŠã«å¿ããŠã PyCharmãããŠã³ããŒãããŸãã ãšãã£ã¿ãŒã®ããŒãžã§ã³ã®éžæã«ã¯è¥å¹²ã®åŸ®åŠãªéãããããŸããProfessionalEditionã§ããPyCharmã¯ãIDEã«çµ±åãããå±éããŒã«ã§è¡šçŸãããGoogle App Engineã®çµã¿èŸŒã¿ãµããŒããåããŠããŸãã PyCharm CEã«ã¯ãã®ãããªãµããŒãããªããããã³ã³ãœãŒã«ããå±éããå¿ èŠããããŸãã
PyCharmã§ãããžã§ã¯ããäœæããŸãã Professional Editionã䜿çšããŠããå Žåããããžã§ã¯ããäœæãããšãã«ããGoogle App Engineãããžã§ã¯ããã¿ã€ããéžæã§ããŸãã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®èå¥åïŒäžèšã®èå¥åïŒãšApp Engine SDKãžã®ãã¹ãæå®ããå¿ èŠããããããäºåã«ããŠã³ããŒãããŠãã ããã ãµããŒããããŠããããã°ã©ãã³ã°èšèªã®SDKãããããå ¥æããŠãã ãã ã PyCharmã¯ãæ¢ã«å®æããapp.yamlæ§æãã¡ã€ã«ãšåäœããmain.pyã¹ã¯ãªããã䜿çšããŠãããžã§ã¯ããäœæããŸãã
å®éãã¡ã€ã³ã¹ã¯ãªããã¯æ¬¡ã®ãšããã§ãã
main.py
import webapp2 class MainHandler(webapp2.RequestHandler): def get(self): self.response.write('Hello world!') app = webapp2.WSGIApplication([ ('/', MainHandler) ], debug=True)
ãã®äŸã¯ãPythonèªäœã®Google App Engine ããã¥ã¢ã«ãšJetBrains Webãµã€ãã®äž¡æ¹ã§æäŸãããŠããŸãã ã¹ã¯ãªããã«ã¯æ³šç®ãã¹ãç¹ã¯ãããŸãã-æšæºã®HelloWorldã§ãã webapp2ã¯ãGoogle App Engineãšäºææ§ããããéåžžã«äœ¿ãããã軜éãªãã¬ãŒã ã¯ãŒã¯ã§ããããšãç¥ããªã人ã«ã ãèšããŸãïŒç§ã䜿çšããéãïŒã
æ§æãã¡ã€ã«ïŒ
app.yaml
application: pygask version: 1 runtime: python27 api_version: 1 threadsafe: yes handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: .* script: main.app libraries: - name: webapp2 version: "2.5.2"
èšå®ãåæããŸãããïŒ
- application-ã¢ããªã±ãŒã·ã§ã³èå¥åïŒãpygaskããšããåèªãæ··åããªãããã«ããŠãã ãã-ããã¯python + gae + flaskã®çç¥åœ¢ã§ã:)ïŒ;
- ãã³ãã©ãŒ-URLãã¿ãŒã³ã®ãªã¹ããšãããã®åŠçæ¹æ³ã®èª¬æã ãã³ãã©ãŒãã£ã¬ã¯ãã£ãã§ã¯ãéçãã³ãã©ãŒãšã¹ã¯ãªãããã³ãã©ãŒã®2çš®é¡ã®ãã³ãã©ãŒã䜿çšã§ããŸãã ãã®å Žåãéçã¯faviconããŒããŒã§è¡šãããã¹ã¯ãªããã¯main.appã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã®ã¡ã€ã³ã¹ã¯ãªããã§ãïŒæ³šæïŒ
.py
æ¡åŒµåã¯å¿ èŠãããŸããïŒã - ã©ã€ãã©ãª -ã¢ããªã±ãŒã·ã§ã³ãæ©èœããããã«å¿ èŠãªã©ã€ãã©ãªã ãã®å Žåãwebapp2ã Google App Engineäžã§å®è¡ãããPython 2.7ã¯ãããã«äœ¿çšã§ããã©ã€ãã©ãªããµããŒãããŠããŸãã å®å šãªãªã¹ãã¯ããã«ãããŸã ã
Google App Engineã¢ããªã±ãŒã·ã§ã³ã®èšå®ã®è©³çŽ°ãªèª¬æã¯ãã¡ãã§ãã
äžè¬ã«ãæåã®ã¢ããªã±ãŒã·ã§ã³ã¯åäœããã¹ãããæºåãã§ããŠããŸãã PyCharmã§ãããžã§ã¯ããå®è¡ããŸãã ããŒã«ã«ãã·ã³ã§ã¯ã 127.0.0.1 ïŒ8080ã§å©çšã§ããŸãïŒãããžã§ã¯ãæ§æã§äœãå€æŽããŠããªãå ŽåïŒã éããšããHello worldïŒããšè¡šç€ºãããŸãããã¹ãŠãæ©èœããŠããŸãã
PyCharmã䜿çšããŠããªãã®ã«ããããžã§ã¯ããéå§ãããå Žåã¯ã©ãããŸããïŒ
Linuxã®æ¹æ³ïŒã¿ãŒããã«ã§ã次ã®åœ¢åŒã§ã³ãã³ããå®è¡ããŸãã
説æã®ããã«ãã³ã³ãœãŒã«ã§pygaskãèµ·åããããã«äœ¿çšããã³ãã³ããæå®ããŸãïŒSDKãšãããžã§ã¯ããã©ã«ããŒã®äž¡æ¹ã<path to python interpeter> <path to SDK>/dev_appserver.py --host 127.0.0.1 <path to project>
/var/www/
ïŒã
ã¿ãŒããã«ã§äŒŒããããªãã®ãå ¥åããŠ127.0.0.1:8080ãéããã§ããã°ãHello worldïŒããåç §ããŠãã ãããandymitrich@pc:~$ python /var/www/google_appengine/dev_appserver.py --host 127.0.0.1 /var/www/pygask/
WindowsãŠãŒã¶ãŒã«é¢ããŠã¯ããã¹ãŠãå°ãç°ãªããŸãã SDKãããŠã³ããŒããããŠã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ãããGoogle App Engineã©ã³ãã£ãŒããããžã§ã¯ãã®èµ·åã«äœ¿çšãããŸãã Mac OSã«ã€ããŠã¯äœãèšããŸãã-誰ããã³ã¡ã³ãã§ããªãã«èšããããããŸããã
æ®å¿µãªãããwebapp2ãã¬ãŒã ã¯ãŒã¯ã¯å¿ èŠãªãã®ã§ã¯ãããŸããã ãããã£ãŠããã©ã¹ã³ãæ¥ç¶ããŸãããã
ãã©ã¹ã³ã¯ããã©ã«ãã§åäœããã©ã€ãã©ãªã®ãªã¹ãã«è¡šç€ºãããªãããããŸãããã®æ¥ç¶ã«æ³šæããå¿ èŠããããŸãã Google App Engineã¯ã䜿çšããã¢ãžã¥ãŒã«ãåå¥ã«æ§æããæ©èœããµããŒãããŠããŸãã ããã¯appengine_config.pyãšãããã¡ã€ã«ã§è¡ãããŸãã ããã§åœŒã«ã€ããŠã®è©³çŽ°ã ãã¬ãŒã ã¯ãŒã¯ãæ¥ç¶ããããã«äœ¿çšããŸãã ãããè¡ãã«ã¯ãpipã䜿çšããŠããã©ã¹ã³ãå éšãã£ã¬ã¯ããªã«ã€ã³ã¹ããŒã«ãã libãšåŒã³ãŸãã æåã§è¡ã
ãŸãã¯ã requirements.txtãã¡ã€ã«ã䜿çšããŸãandymitrich@pc:~$ pip install -t /var/www/pygask/lib/ flask
andymitrich@pc:~$ pip install -r /var/www/pygask/requirements.txt -t /var/www/pygask/lib/
-t
ãªãã·ã§ã³ã«æ³šæããŠãã ãã-ããã±ãŒãžãã€ã³ã¹ããŒã«ãããã¹ãå«ãŸããŠããŸãã
Flaskãã€ã³ã¹ããŒã«ããã䜿çšã§ããŸã-èšå®ãšã¡ã€ã³ã¹ã¯ãªãããå°ãæžãæããŸãïŒ
- app.yamlã¢ããªã±ãŒã·ã§ã³èšå®ããã libraryãã£ã¬ã¯ãã£ãã䜿çšããŠã»ã¯ã·ã§ã³ãåé€ã§ããŸã-äžèŠã§ãã
- ã¡ã€ã³ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
main.pyfrom flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello world!'
ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããã©ã¹ã³ãååŸããããã«ã appengine_config.pyãã¡ã€ã«ã§ãã®å Žæã瀺ããŸãã
appengine_config.py
import site import os.path site.addsitedir(os.path.join(os.path.dirname(__file__), 'lib'))
ç§ãã¡ã¯å§ããããšããŸã-ç§ãã¡ã¯ãã¹ãŠåããHello worldïŒããèŠãŸãã
ãããžã§ã¯ããå€ããå°ãªããèŠæ ãã®ãããã®ã«ããŸããã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãéçãã¡ã€ã«ãšãã³ãã¬ãŒãã®ãã©ã«ããŒãè¿œå ãããã³ãã©ãŒãšãã¥ãŒãå¥ã®ãã¡ã€ã«ããåé€ããŸãã éåžžã®ãã©ã¹ã³ãããžã§ã¯ããæ§ç¯ããŠãããã®ããã«åäœããŸãã ãã¹ãŠã®æäœã®åŸããããžã§ã¯ãããªãŒã¯æ¬¡ã®ããã«ãªããŸãã
ããã«ãä»»æã®æ¹åã§éçºã§ããŸãã
å ã®ãã¡ã€ã«ãã©ã®ããã«å€æŽããããã«æ³šç®ããŸãã
- çŸåšã1è¡ã§æ§æãããŠããã¡ã€ã³ã¹ã¯ãªãã
main.pyimport application
- ãããžã§ã¯ãæ§æãã¡ã€ã«
app.yamlapplication: pygask version: 1 runtime: python27 api_version: 1 threadsafe: yes handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: .* script: main.application.app
æ§æãã¡ã€ã«ã§ãã¡ã€ã³ã¹ã¯ãªãããžã®ãã¹ãå€æŽãããŸãã-ã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã®è¡šç€ºãè¿œå ãããŸããã
衚瀺ããããHello worldïŒãã¯åããŠã ãšããŸãããã appspot.comã«ãããã€ããŸãããã å®éãããã§ãè€éãªããšã¯äœããããŸããã ãã ããéå§ããåã«ãéèŠãªããšã1ã€èšããããšæããŸããéçºããã»ã¹ã«ã¯ããµãŒããŒã«ã¯äžèŠãªå€ãã®äœæ¥ãã¡ã€ã«ããããŸãã ãããã€ã¡ã³ãäžã«ããããããã«å°éããªãããã«ããããã«ãã¢ããªã±ãŒã·ã§ã³æ§æã®skip_filesãã£ã¬ã¯ãã£ãã§ãã¬ã€ã¢ãŠããã¹ãã§ã¯ãªããã¹ãŠã®ãã®ãæå®ã§ããŸãã 詳现
ããªãã幞ããªPyCharmãŠãŒã¶ãŒã§ããã°ããæãé£ãããæäœãè¡ãå¿ èŠããããŸãïŒããŒã«-> Google App Engine-> App Engineã¢ããªã®ã¢ããããŒã...次ã«ããããæåã®å±éã§ããå Žåãããªãã«åã£ãèªèšŒæ¹æ³ãéžæããŸãïŒã¡ãŒã«/ãã¹ã¯ãŒãã®ãã¢ãç解ã§ããŸããã§ãã-ãªããã®ããŒã¿ã¯é©åããªãã£ãã®ã§ãOAuth2ã䜿çšããŸããããæ°ã«ããŸããã§ããïŒãã§ããã°httpïŒ// [identifier] .appspot.com ïŒãã®å Žåã¯pygask.appspot.com ïŒã«ã¢ã¯ã»ã¹ããŠãäœæ¥ã®çµæã確èªããŸãã
äœããã®çç±ã§äžèšã®IDEã䜿çšããªãå Žåãã¬ã·ãã¯1è¡ã«ãªããŸãïŒLinuxã®æ¹æ³ïŒã
ãããã£ãŠãç§ã¯äœ¿çšããŸãïŒ<path to python interpeter> <path to SDK>/appcfg.py <path to project>
andymitrich@pc:~$ python /var/www/google_appengine/appcfg.py --oauth2 /var/www/pygask/
--oauth2
ãã©ã¡ãŒã¿ãŒã«æ³šæããŠ
--oauth2
ãä»ããæ¿èªã«å¿ èŠã§ãã æå®ããªãã§ãã ãã-ã¡ãŒã«/ãã¹ã¯ãŒãã®å ¥åãæ±ããããŸãã ããŒã ãæ£åžžã«å®äºããå Žåããããžã§ã¯ãã¯é©åãªã¢ãã¬ã¹ã§å©çšã§ããŸãã
ããã ãã§ãããã®è³æã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã èå³æ·±ãå Žåã¯ãä»åŸããã®ã¢ã€ãã¢ã®æ çµã¿ã®äžã§ãVKontakte APIãšLast.fm APIãã©ã®ããã«æ¥œããã ããã話ãããŸãã ãæž èŽããããšãããããŸããã
PSã³ãŒãã¯githubã«ãããŸãïŒ pygask ã