読者です 読者をやめる 読者になる 読者になる

Python

Pythonで、日本語をCookie値へ設定する方法を調べてみた

以前、PythonでCGIのCookieを使ってみました。 Docker + Alpine3.5 + Apache2.4 + Python3.6で、CGIのCookieを使ってみた - メモ的な思考的な その時は日本語をCookie値へ設定する方法が気になっていたものの、深入りしませんでした。 そこで今回、以下を参…

Python + astモジュールを使ってソースコードを解析し、メソッドブロックや関数ブロックの定義行と最終行を取得する

Pythonソースコードを解析して、メソッドブロックや関数ブロックの定義行と最終行を取得することがありました。 Pythonでは標準モジュールのastを使ってソースコードを解析できるため、試した時のメモです。 32.2. ast — 抽象構文木 — Python 3.6.1 ドキュメ…

Docker + Alpine3.5 + Apache2.4 + Python3.6で、CGIのCookieを使ってみた

前回、CGIのリダイレクトを使ってみました。 Docker + Alpine3.5 + Apache2.4 + Python3.6で、CGIのリダイレクトを使ってみた - メモ的な思考的な 今回はCGIのCookieを使ってみます。 目次 環境 PythonのCookieまわりの標準モジュールについて CookieのExpir…

Docker + Alpine3.5 + Apache2.4 + Python3.6で、CGIのリダイレクトを使ってみた

以前、SSIを使ってみました。 Docker + Alpine3.5 + Apache2.4 + Python3.6で、SSIを使ってみた - メモ的な思考的な 今回はCGIのリダイレクトを使ってみます。 目次 環境 Locationヘッダを使ったリダイレクト NPHスクリプトによる、Locationヘッダを使ったリ…

Docker + Alpine3.5 + Apache2.4 + Python3.6で、SSIを使ってみた

前回、フォームのデータをcgiモジュールを使って受け取りました。 Docker + Alpine3.5 + Apache2.4 + Python3.6で、フォームのデータを標準モジュールcgiで受け取ってみた - メモ的な思考的な 今回は、ApacheのSSI(Server Side Include)を、公式チュートリア…

Docker + Alpine3.5 + Apache2.4 + Python3.6で、フォームのデータを標準モジュールcgiで受け取ってみた

前回、フォームのデータをCGIのPythonスクリプトでsys.stdin.read()とos.environを使って受け取りました。 Dockerで、Alpine3.5 + Apache2.4 + Python3.6の環境を作って、フォームのデータをCGIで受け取ってみた - メモ的な思考的な 今回は標準モジュールcgi…

Dockerで、Alpine3.5 + Apache2.4 + Python3.6の環境を作って、フォームのデータをCGIで受け取ってみた

以前、DockerでCGIを動かしてみました。 Dockerで、Alpine3.4 + Apache2.4.25 + Python3.6.0の環境を作って、CGIを動かしてみた - メモ的な思考的な 今回は、Dockerで、Alpine3.5 + Apache2.4 + Python3.6の環境を作って、フォームのデータをPythonのCGIで受…

Pythonで、unittest.mock.patchを使ってデコレータを差し替える

同僚と話している中で、unittest.mock.patchを使ったデコレータの差し替えに関する話題が出ました。 そういえばデコレータは差し替えたことがなかったため、試してみたことをメモします。 なお、「テストファイル群に、デコレータを差し替える/差し替えない…

Pythonで、Werkzeug.testを使って、WSGIサーバを起動せずにWSGIアプリのテストをする

以前、WebTestやwsgi-interceptを使ってWSGIアプリのテストをしました。 Pythonで、WebTestを使って、WSGIサーバを起動せずにWSGIアプリのテストをする - メモ的な思考的な Pythonで、wsgi-interceptを使って、WSGIサーバを起動せずにWSGIアプリのテストをす…

Pythonで、RequestのCookieを使ってみた

以前、wsgi-interceptを使った時に、PythonのHTTPライブラリとして、Requestsを使いました。 Requests: HTTP for Humans — Requests 2.13.0 documentation 使っている中で、RequestのCookieの使い方について迷ったことがあったため、メモを残します。 環境 M…

Python3で、リテラルのエスケープシーケンスに見える非リテラルの文字列を、Unicode文字へと変換する

Python3で、リテラルに改行コードなどを含めたい場合、エスケープシーケンスを使います。 2.4.1. 文字列およびバイト列リテラル | 2. 字句解析 — Python 3.6.1 ドキュメント 例えば、「Hello(改行) world」としたい場合、 $ python Python 3.6.1 (default, A…

Pythonで、wsgi-interceptを使って、WSGIサーバを起動せずにWSGIアプリのテストをする

以前、WebTestを使ってWSGIアプリのテストを行いました。 Pythonで、WebTestを使って、WSGIサーバを起動せずにWSGIアプリのテストをする - メモ的な思考的な 他にもテストツールがないかを探したところ、wsgi-interceptがありました。 cdent/wsgi-intercept:…

Python + Bottleで、フォームやCookieに日本語を設定したら文字化けした

Python + Bottleで、フォームやCookieに日本語を使ったら文字化けしたため、メモを残します。 目次 環境 フォームやCookieに設定した値の取得について 日本語の文字化けと対応について その他 ソースコード 環境 Python 3.6.1 Bottle 0.12.13 フォームやCook…

Python + modulefinder + collections.Counterで、モジュールがimportされた回数を調べる

複数のPythonスクリプトを対象に、モジュールがimportされた回数を知りたくなりました。 ロードされているモジュールはsys.modulesなどが使えますが、これではimportされた回数が分かりません。 調べてみたところ、標準ライブラリmodulefinder + collections…

Pythonで、os.walk()を使って、特定のディレクトリを除いたファイル一覧を取得する

Pythonで、特定のディレクトリを除いたファイル一覧を取得することがあったため、メモを残します。 目次 環境 os.walk()の動き ファイルの一覧を取得 特定のディレクトリを除いたファイルの一覧を取得 スライス(dirs[:])で差し替え remove(dirs.remove('hoge…

Pythonで、WebTestを使って、WSGIサーバを起動せずにWSGIアプリのテストをする

Pythonで、「WSGIサーバを起動せずにWSGIアプリをテストする」方法を探してみたところ、ライブラリWebTestがありました。 Pylons/webtest: Wraps any WSGI application and makes it easy to send test requests to that application, without starting up a…

Python + pytestにて、pytest.raisesを使って例外をアサーションする時の注意点

Python + pytestにて、「pytest.raisesを使って例外をアサーションする」テストコードを作成する機会がありました。 ただ、書き方を誤りうまくアサーションできなかっため、メモを残します。 目次 環境 状況 原因 対応 ソースコード 環境 Python 3.6.0 unitt…

Pythonで、モックに差し替えたメソッドが呼ばれた回数や呼ばれた時の引数を検証する

Pythonにて、「モックに差し替えたメソッドが呼ばれた回数や呼ばれた時の引数を検証する」テストコードを作成する機会があったため、メモを残します。 目次 環境 状況 対応 メソッドが呼ばれた回数を検証 メソッドが呼ばれた時の引数を検証 メソッドが呼ばれ…

Pytnonで、unittest.mock.patch.objectのautospecとside_effectを使って、テスト対象の属性(self.attr)を更新する

Pythonにて、「メソッドを差し替え、テスト対象オブジェクトの属性を更新する」テストコードを作成する機会があったため、メモを残します。 なお、良いタイトルが思い浮かびませんでしたので、mock.object(autospect=True)のサンプルとして考えてください… …

Dockerで、Alpine3.4 + Apache2.4.25 + Python3.6.0の環境を作って、CGIを動かしてみた

以前、httpd:alpineのApacheを使ってみました。 Docker for Macにて、httpd:alpineのApacheを使ってみた - メモ的な思考的な 今回は、DockerでAlpine3.4 + Apache2.4.25 + Python3.6.0の環境を作って、CGIでPythonスクリプトを動かしてみます。 目次 環境 Do…

Pythonで、MagicMockのreturn_valueを使って、モックから別のモックを返してみた

Pythonにて、「モックから別のモックを返す」テストコードを作成する機会がありました。 そこで、以下を参考に作成した時のメモを残します。 26.6. unittest.mock — 入門 — Python 3.6.0 ドキュメント Pythonの万能モック MagicMockと戯れる #Pistatium 目次…

Python + pytestで、monkeypatch.setattr()を使ってみた

pytestでは、monkeypatchを使ってmockを作成できます。 Monkeypatching/mocking modules and environments — pytest documentation モンキーパッチ/モックのモジュールと環境 今回は、monkeypatch.setattr()を使って、 プロダクションコードのメソッドや関…

Python2で、type()関数を使うと<type 'instance'>が返ってきた

Python2でprintデバッグをした際、インスタンスの型名が知りたくなりました。 type()関数を使ったところ、<type 'instance'>が返ってきたので、これは何だろうと思って調べた時のメモです。 type() | 2. 組み込み関数 — Python 2.7.x ドキュメント 環境 Python 2.7.13 結果 Py</type>…

PythonのReportLabで、表(TableやTableStyle)について調べてみた

ReportLabでpdfに表を描いてみたところ、悩んだところがあったため、メモを残しておきます。 なお、詳細はReportLabの公式ドキュメント中の「ReportLab PDF LibraryUser Guide」のp77〜にも記載があります。 ReportLab Documentation - ReportLab.com (pdf注…

Django + ReportLabをHerokuで動かしてpdfを表示する

最近、Pythonでpdfを作成する機会がありました。 Pythonのpdf作成ライブラリには何があるのかを調べたところ、ReportLabが一番有名そうでした。 ReportLab - Content to PDF Solutions rptlab / reportlab — Bitbucket また、DjangoのドキュメントにもReport…

HerokuにDjangoアプリをデプロイするとcollectstaticが自動実行される

HerokuにDjangoアプリをデプロイしたところ、 remote: ! Error while running '$ python manage.py collectstatic --noinput'. remote: See traceback above for details. remote: remote: You may need to update application code to resolve this error. …

DjangoをHeroku + uWSGIで動かしてみた

最近uWSGIにふれたため、HerokuでuWSGIを動かしてみようと思いました。 ただ、Herokuのチュートリアルではgunicornを動かしていました。 Getting Started on Heroku with Python | Heroku Dev Center HerokuでuWSGIで動かす方法を調べたところ、uWSGIのドキ…

Python + pytestで、プレフィクスがアンダースコア2つの関数(プライベート関数)をテストする

pytestにて、プライベート関数のテストで悩んだことがあったため、メモを残します。 なお、今回のテスト対象コードは以下とします。 target.py def __double_underscore_function(): return 'double' 目次 環境 プライベート関数のimportについて 通常のコー…

Pythonのテストコードで、モジュールをモックに差し替える

Pythonにて、開発環境に無いモジュールをimportしているプロダクションコードに対して、テストコードを書く機会がありました。 ただ、テストコードにてモジュールをモックに差し替える方法で悩んだため、メモを残します。 目次 環境 対応 ソースコード 環境 …

DjangoにDjangoミドルウェアとWSGIミドルウェアを組み込んでみた

この記事は「Django Advent Calendar 2016 - Qiita」の13日目の記事です。 Djangoにはミドルウェアというフレームワークがあるため、リクエスト/レスポンス処理をフックして処理を追加できます。 Middleware | Django documentation | Django また、Djangoは…

Django + Handsontable.jsを使って、Excel風な入力画面を作ってみた

この記事は「Django Advent Calendar 2016 - Qiita」の11日目の記事です。 最近、DjangoでExcel風な入力画面を持つWebアプリを作る機会がありました。 何か良い方法がないかを調べたところ、jQueryへの依存がないJavaScriptライブラリHandsontableを知りまし…

Pythonで、WSGIミドルウェアを作ってみた

WSGIアプリケーションを作る中で、WSGIミドルウェアの存在を知りました。 第3回 WSGIミドルウェアの作成:WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社 そこで今回、WSGIミドルウェアを作ってみることにしました。 目次 環境 …

mod_wsgiやuWSGIで使われる、デフォルトのWSGI callback名を調べてみた

WSGIアプリの書き方について調べている時、 def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello, world."] や、 class MyWSGIApplication(object): def __call__(self, environ, start…

Macで、uWSGIをインストールしたらエラーになった

MacのPython環境にuWSGIをインストールしようとしたところ、 # Xcodeのバージョン確認 $ xcodebuild -version Xcode 8.1 Build version 8B62 # pipでインストール $ pip install uwsgi ... *** uWSGI linking *** ... ld: file not found: /usr/lib/system/l…

Pythonで、Cookieを扱うWSGIフレームワークを自作してみた

前回、書籍「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」をもとに、PythonでURLルーティング機能だけがあるWSGIフレームワークを自作しました。 gihyo.jp 今回は、以下のRFC6265やWebサイトを参考に、前回のWSGIフレームワークにCoo…

Pythonで、URLルーティング機能だけがあるWSGIフレームワークを自作してみた

以前、 WSGI準拠のWebサーバ WSGIアプリケーション を自作しました。 これらの自作により、「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」の第3章以降もPythonで書く見通しが立ちました。 gihyo.jp 第3章以降では、URLルーティングや…

Pythonで、自作したWSGI準拠のWebサーバ上で、自作のWSGIアプリを動かしてみた

前回、WSGI準拠のWebサーバを自作しました。 その時はWSGIアプリケーションフレームワークとしてBottleを使いましたが、今回はWSGIアプリケーションも自作してみます。 目次 環境 最も単純なWSGIプリケーション Jinja2テンプレートを使う(関数版) Jinja2テン…

PythonでWSGI準拠のWebサーバを自作し、その上でBottleを動かしてみた

以前、「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を参考に、PythonでWebサーバを書きました。 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」が良かったのでPythonで書いてみた - メモ的な思考的な gihyo…

Visual Studio CodeでPython + Djangoを書いて、py.testを実行してみた

それなりの規模のDjangoアプリを書く場合、PyCharmなどのIDEを使っています。 ただ、諸般の事情によりIDEが使えないことも考えて、Visual Studio Code(以下VS Code)のPython拡張を試してみました。 Python with Visual Studio Code - Visual Studio Code な…

「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」が良かったのでPythonで書いてみた

Pythonでhttp.serverを使っているうちに、せっかくならもう少し下のレイヤについても知りたくなりました。 何か良い資料がないかを探したところ、本当の基礎からのWebアプリケーション入門――Webサーバを作ってみようというページを見つけ、さらに書籍「Webサ…

pure Pythonのライブラリapcaccessを使って、apcupsdのデータを取得する

apcupsdで取得できるUPS情報をPythonのオブジェクトとして扱う方法を探したところ、apcaccessライブラリを見つけました。 apcaccess 0.0.4 : Python Package Index flyte/apcaccess | GitHub 試してみた時のメモを残します。 環境 Windows10 x64 Python 3.5.…

Windows10 + Python3 + apcupsdで、UPSの状態をブラウザから確認する

以前、あるWindows端末に接続されているAPC製UPSの状態を、別の端末のブラウザから確認できるよう、Rubyを使って実装しました。 Windows7 + WEBrick + apcupsdで、UPSの状態をブラウザから確認する - メモ的な思考的な 今回は、Pythonを使って同じことを試し…

Python2 + Bottleで、XMLファイルそのものをレスポンスとして返す

Bottleでは、 @route("/xml") def xml_response(): response.content_type = 'xml/application' xml = '<foo>Hello xml!</foo>' return xml とすれば、XMLのレスポンスを返すことができます。 How to send xml/application format in bottle? - Stack Overflow ただ、XM…

Python2 + Bottleで、別の端末からアクセスできるようにする

Bottleアプリを書いていた時に、 自分の端末からはアクセス可能 LAN上の他の端末からはアクセス不可 ファイアウォールのポートは開いている という状態になったので、調べた時のメモ。 環境 Windows10 x64 Python 2.x Bottle 0.12.9 対応 run()の引数hostが…

Python2 + Bottleで、URL末尾のスラッシュの有無にかかわらず同じコンテンツを表示する

Bottleで、 /slash/ /slash を同じURLと解釈してコンテンツを表示する際、 @route("/slash") @route("/slash/") def slash(): return "Hello world!" としていたのですが、他に良い方法がないかを調べた時のメモです。 環境 Windows10 x64 Python 2.x Bottle…

Python2 + Bottleで、404ページを強制的に表示する

Bottleで404ページを強制的に表示したくて調べた時のメモです。 環境 Windows10 x64 Python 2.x Bottle 0.12.9 調べたこと どうやって実装するのが良いのか調べたところ、stackoverflowでabort()を使っている回答がありました。 python - Bottle.py error ro…

pip uninstall -r requirementsの動作を確認する

Pythonのパッケージ管理システムのpipでは、requirements.txtに必要なパッケージを記述しておくことで、 pip install -r requirements.txt で一括インストール pip uninstall -r requirements.txt で一括アンインストール ができます。 そんな中、pip uninst…

Python3 + Flask + PySNMP + Highcharts + Apache2.4で、PX-105のインク残量を取得・表示し、Gmailでインク残量を送信する

以前、Ruby + SinatraでPX-105のインク残量を取得・表示したことがありました。 Ruby + Sinatra + SNMPでPX-105のインク残量を取得・表示する - メモ的な思考的な 最近さわっているPythonでも同じことができないかと思い、Python3 + Flask + PySNMP + Highch…

Windows + Python3 + PySNMPで、SNMPのGET Requestを送信する

Windows + Python3でSNMPを扱おうとしたところ、PySNMPが動きそうでした。 SNMP library for Python — PySNMP etingof/pysnmp: [OFFICIAL] Pure-Python SNMP library そこで、公式ドキュメントや書籍を見て手を動かした時のメモを残します。 なお、SNMPデー…

Python3 + google-api-python-clientで、Gmail APIを使ってメールを送信する

前回はPythonの標準ライブラリを使って、Gmailからメールを送信しました。 Python3.5 + smtplib.SMTP_SSL.send_message()で、Gmailからメールを送信する - メモ的な思考的な ただ、Googleアカウント名とパスワードをスクリプト上に書いておく必要があったた…