1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Brython ajaxでpythonのrequestsもどきを作ってみる

Posted at

#はじめに
タイトルの通り。
ほぼ忘備用です。
Brythonは全く触ったことない初心者が書いてます。

#目次
経緯的な
準備
実行
結果
課題

#経緯的な
pythonをjavascriptで動かすためにBrythonを触っていたところ、
そのBrythonではrequestsモジュールがサポートされていないことが分かった。

ので、
ajax使ってそれっぽいもの作ってみよう、ということに。

※Brythonについてはここ読んで

#準備

さてここから本題。
上記のここからBrython一式をダウンロード。
(今回は)不必要なものもあったので、それらを省略したパスがこんな感じ。

www----fonts
    L--tests----ace
             L--brython_test_utils
             L--editor.html
             L--editor.py
             L--tests_editor.py
             L--requests.py
             L--dom_js_tests.js
             L--jsobj_tests.js

拡張子ついてない物はファイルです。
(今回、特に触っていないので中身はそのまま使ってもらえば大丈夫かと)
この中で大事なのは自作したrequests.py。
この中にrequestsもどきを書いて、他で呼ぶ形にしています。

requests.py
import json

def get(send_url,params="None"):
    from browser import document, ajax

    #paramsが設定されていた場合に実行(パラメータをセット)
    if params != "None":
        send_url = send_url + "?"
        params_count = len(params.keys())
        for paramskey in params.keys():
            send_url = send_url + paramskey + "=" + params[paramskey]
            params_count = params_count -1
            if params_count != 0:
                send_url = send_url + "&"
    
    req = ajax.Ajax()

    # send a POST request to the url
    # Bind the complete State to the on_get_complete function
    req.open('GET', send_url, False)
    req.set_header('content-type', 'application/x-www-form-urlencoded')
    req.send()

    return req

getが呼ばれたらsend_url(送り先)とparam(パラメータ)を受け取って、req.send()で送信。
返ってきた値をreturnで返しています。

「req.open('GET',send_url,False)」部分で、同期通信をしています。
FalseをTrueに変えれば非同期通信になりますが、空っぽのreqが返ることになるので一旦同期しています(多分スレッドとか使えば非同期でも最終的に値を返せる…はず)。

これで準備終わり。

#実行

localhostでいいのでサーバを立てて、~www/tests/editor.htmlにアクセス。
ボクはお手軽だったのもあってXAMPP使って立てました。
パスは環境に合わせて調整してください(~部分)。
下の画像のような画面が開けばOK(レイアウト変えてないのでBrythonの画面ままです)。

スクリーンショット (1299).png

runのボタンを押すと、
左側に書いたPythonを実行し、その結果が右側に出力されます。

ではやっていきましょう。
今回はこちらのAPIをお借りしました。
ランダム生成された個人情報っぽい情報が取得できます。

実行するPythonはこちら

oridin_requests.py
import requests
import json

url = 'https://randomuser.me/api/'
res = requests.get(url)

response = json.loads(res.text)
print(response)
result = response["results"][0]
#print("result" ,result)
#gender = result["gender"]

#結果
実行した結果がこちら。
途中で関係ないボタン等を削ったので見た目少し違ってます。
スクリーンショット (1300).png

無事、requestsが動いているように見える動作ができました。
最後に行のコードもコメント外せば出力されます。
返ってきたレコードの一部を取得したい場合は、適当に使ってください。

#課題
(解決方法知ってるよ!って方がいればコメントで是非)
・非同期通信でも、最終的に画面で書いたコード部分に値を渡したい。
・一部APIでCORSのためか値を返してくれない(通信そのものが失敗している)。
 →「https://zipcloud.ibsnet.co.jp/api/search 」(パラメータで渡した情報の住所を取得するAPIです)」
 →APIの詳しいことはこちら(郵便番号検索API)

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?