🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

913閲覧

Pythonを使用してResponderのView操作をしたい。

takochan1192

総合スコア100

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/11/28 14:50

pythonの初心者です。
普段はNuxt.Jsを用いてフロントエンドの開発を行っています。
来年のプロジェクトで、pythonを使用したDB構築を考えているのですが、
社内に詳しい方がおらず手探りの状態です。

なにがやりたいのかというと、
Responderを用いて最終的には、DBを構築して、
フロントエンドで叩けるようなRestAPIを作成したいと思っています。
まずは簡単なものからと思い下記のサイトを参考にresponderを使用してViewの操作というものに挑戦してみようと思い、jupyternotebookを使用してコードを作成したのですが、エラーとなっている状態です。
参考サイト

error

1--------------------------------------------------------------------------- 2RuntimeError Traceback (most recent call last) 3<ipython-input-4-d169c68c61c2> in <module> 4 5 resp.text = 'hello, world!' 5 6 if __name__ == '__main__': 6----> 7 api.run() 7 8~\anaconda3\envs\RestAPItest\lib\site-packages\responder\api.py in run(self, **kwargs) 9 357 if "debug" not in kwargs: 10 358 kwargs.update({"debug": self.debug}) 11--> 359 self.serve(**kwargs) 12 360 13 361 async def __call__(self, scope, receive, send): 14 15~\anaconda3\envs\RestAPItest\lib\site-packages\responder\api.py in serve(self, address, port, debug, **options) 16 352 uvicorn.run(self, host=address, port=port, debug=debug, **options) 17 353 18--> 354 spawn() 19 355 20 356 def run(self, **kwargs): 21 22~\anaconda3\envs\RestAPItest\lib\site-packages\responder\api.py in spawn() 23 350 24 351 def spawn(): 25--> 352 uvicorn.run(self, host=address, port=port, debug=debug, **options) 26 353 27 354 spawn() 28 29~\anaconda3\envs\RestAPItest\lib\site-packages\uvicorn\main.py in run(app, **kwargs) 30 344 supervisor.run() 31 345 else: 32--> 346 server.run() 33 347 34 348 35 36~\anaconda3\envs\RestAPItest\lib\site-packages\uvicorn\main.py in run(self, sockets) 37 372 self.config.setup_event_loop() 38 373 loop = asyncio.get_event_loop() 39--> 374 loop.run_until_complete(self.serve(sockets=sockets)) 40 375 41 376 async def serve(self, sockets=None): 42 43~\anaconda3\envs\RestAPItest\lib\asyncio\base_events.py in run_until_complete(self, future) 44 590 """ 45 591 self._check_closed() 46--> 592 self._check_running() 47 593 48 594 new_task = not futures.isfuture(future) 49 50~\anaconda3\envs\RestAPItest\lib\asyncio\base_events.py in _check_running(self) 51 550 def _check_running(self): 52 551 if self.is_running(): 53--> 552 raise RuntimeError('This event loop is already running') 54 553 if events._get_running_loop() is not None: 55 554 raise RuntimeError( 56 57RuntimeError: This event loop is already running

コード自体は参考サイトのものをそのまま使用し、下記のように作成し
実行しました。

python

1import responder 2api = responder.API() 3@api.route('/') 4def hello_world(req, resp): 5 resp.text = 'hello, world!' 6if __name__ == '__main__': 7 api.run()

もちろんresponderがインストールされていないので、pip install responderは行っています。
Anaconda を使用し、そこでjupyterNotebookを使用しております。
pythonはつい先ほどインストールしましたので、最新版です。

アウトプットとしては下記のものを想定しており、
Uvicorn のhttpをクリックすると'hello world!'が表示される予定でおります。

output

1INFO: Started server process [6440] 2INFO: Waiting for application startup. 3INFO: Uvicorn running on http://127.0.0.1:5042 (Press CTRL+C to quit)

どなたかご教示いただけませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実行環境に対応していないのだと思います。

問題の原因は、内部で使われているモジュールの、
稼働中のイベントループ内で同イベントループを起動しようとしている点。

Jupyter Notebookに限らず、IDE等から実行しようとした場合等、
実行環境によって起こるエラーです。

各ライブラリや環境で同様の問題報告は挙がってますが、
元のライブラリ側では 状態: won't fix なので、想定外の利用とされてます。


対応方法は、いくつかあり

  • コマンドラインからの実行を試してみる。
  • nest_asyncio ライブラリを使う。
  • 動作報告のあるバージョンで環境構築する。
  • 起動済のイベントループを明示的に利用する事でも対応できますが、

 今回のケースでは、ライブラリ内でハードコーディングされてる部分なので、
この方法での対応は難しそう。


nest_asyncio モジュールを使う

python

1!pip install nest_asyncio 2 3 4... 省略 5 6 7if __name__ == "__main__": 8 import nest_asyncio 9 nest_asyncio.apply() 10 11 api.run()
  • nest_asyncio.apply() では、asyncio モジュールにパッチを当てるため、

 一度実行すると、同プロセス内で取り消し操作はできません。別セルで実行でも良い。

  • 複数回実行は問題有りません。パッチが適応済の場合は何もしない。
  • コマンドラインからの実行で問題ない場合は、このモジュールによるパッチは不要です。

これらの対応は、IDE や Jupyter Notebook 上でのデバッグ時のみにしたほうが良いです。
プロダクション環境では不要なはずです。


関連:

投稿2020/11/29 02:27

teamikl

総合スコア8740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takochan1192

2020/11/29 04:22

ご回答いただきましてありがとうございます。 早速ご教示いただきまして方法で行ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問