ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2016-02-25

django.db.utils.ProgrammingError: relation "auth_group" does not exist

Djangoで、manage.py test をしたら、
django.db.utils.ProgrammingError: relation "auth_group" does not exist
とかいうエラーになって困った。開発環境のmacの上では起こらないんだけど、Ubuntu Server14.04で起こる。データベースはPostgreSQL。

何だろうっていろいろ調べたけど、ここが答えをくれた。 次のように言ってる人がいた。
Did you run python manage.py makemigrations appname first, where "appname" is the name of the app containing your custom user model inheriting from AbstractUser?
AbstractUserを定義しているappnameを指定して、makemigrationsをしたら解決。モデルがちゃんとつくられていなかったみたい。そういえば、DBをflushした後、これを実行するの忘れてたかも。

migrationのテーブルに不完全なデータしかない状態で、テスト用のテーブルを作成しようとしてエラーになっていたということだろうか。

2016-02-11

Ubuntu14.04でDjangoを複数動かす

Apache2.4のVirtualHost、python3.4のvenv、mod_wsgiのdaemon mode、これらを使った。手順というよりも注意点を書き留めておく。

Ubuntu14.04では、python3のvenvが失敗するという情報があったけど、大丈夫だった。venv(もしくはpyvenv)は、「apt-get install python3.4-venv」でインストールしないといけない。
venvが失敗するというのは、ensurepipモジュールが欠けていて、pipがインストールされないとのことだった。その場合に、手動でpipをインストールすれば良いとかいう情報もあった(手動でpipをインストールした場合、apt-getからインストールしたpython3-psycopg2とかpython3-lxmlとかへのパスが通っているのかは謎)。しかし、問題なくvenvを実行できた。

仮想環境をつくるときは、pyvenvではなく、python3 -m venv を呼び出すクセをつけておいた方が良さそう。複数のバージョンのpython3が入っている場合に、どのpython3を使ってvenvを実行するのかで、仮想環境で使うpythonのバージョンを選択できるからだ。pyvenvだとこれができない。

とはいえ、mod_wsgiを動かすpythonのバージョンを細かく指定することは、たぶんできない。だから本番のサーバーではpyvenvを使おうがvenvを使おうが同じことだ。

仮想環境をつくるときは、「python3 -m venv --system-site-packages --symlinks 仮想環境ディレクトリへのパス」という具合にオプションを与えておくと、activateしたときに、mod_wsgiを動かすときに近い環境になるはず。--upgradeを付けとけば、失敗してもやり直せる。(--upgrade なしでもやり直せそう。あと、--symlinks はデフォルト値だから省略していい。)

activateするには、「source 仮想環境ディレクトリへのパス/bin/activate」。 activateした後でsudoすると、環境変数が上書きされてしまうのでやってはいけない。たとえば、activateした後で「sudo pip install django」とやると、デフォルトのpython2のsite-packagesにdjangoがインストールされてしまう。そうならないように「sudo -s」としてから、activateする。で「pip install django」とやれば、仮想環境のsite-packagesにインストールされる。



2016-02-02

mkvirtualenvのとき --always-copy しておきたい

Macで、virtualenvwrapperというのを使って、複数バージョンのpythonを管理している。プロジェクトごとにsite-packageを管理できたりして便利なやつだ。
これで仮想環境をつくるとき、
mkvirtualenv --python=python3 --always-copy project_name
みたいに引数に、--always-copy を入れておくと良さげ。

というのは、MacでHomeBrewを使ってPythonを入れていると、古いバージョンのPythonがなくなって困る可能性があるから。

2015-09-02

lxmlのインストール失敗 fatal error: 'libxml/xmlversion.h' file not found

lxmlをインストールしようとしたら、
fatal error: 'libxml/xmlversion.h' file not found
とかいうエラーになる。python3.4で、MacのOSX10.10。

英語だけど解決には、このページが参考になりそう。http://stackoverflow.com/questions/19548011/cannot-install-lxml-on-mac-os-x-10-9

まずは、ターミナルで、
$ xcode-select --install 
とやってみる。なんかダイアログがでてきて、xcodeをAppStoreからインストールするかどうか聞かれる。xcodeはインストール済みなので、コマンドラインツールだけをインストールするために[インストール]ボタンを押した。

で、再挑戦 $ pip3 install lxml

成功したっぽい
Successfully installed lxml


2013-07-05

Djangoで静的ファイルを配信する

settings.pyの設定項目として、MEDIA_URL、MEDIA_ROOT、STATIC_URL、STATIC_ROOT、STATICFILES_DIRSなどがある。昔は、STATICなんちゃらという設定項目は存在しなかったと思う。しかし現在は、MEDIAなんちゃらはユーザがアップロードするファイルの保存と配信についての設定項目で、STATICなんちゃらは開発者があらかじめアップロードしておく静的ファイルの保存と配信のための設定という使い分けがされている。だから、MEDIAなんちゃらとSTATICなんちゃらを同じ値にしてはいけない。

さて、STATIC_URLは、静的ファイルをhttpで配信するときのURLの設定になる。templateのなかでは、{{STATIC_URL}} とやればその値を参照できる。たとえば、STATIC_URL='/static/'; という具合に設定する。

STATIC_URLを指定しても、実は、Djangoは静的ファイルの配信をまったくやってくれない。静的ファイルの配信はWebサーバーの仕事で、Djangoの仕事ではないから、というのがその理由だ。だから、ApacheならApacheを適切に設定してやらないといけない(Djangoの開発用サーバーを使っている場合については後述)。STATIC_URLは、Webサーバーの設定をやり易くしてくれるだけのものだ。

静的ファイル配信のためのWebサーバーの設定を簡単にするために大切なことは2つある。
ひとつは、URLが統一されていること(STATIC_URL)。
もうひとつは、配信する静的ファイルが同じディレクトリにまとめられていることだ。
どこにファイルをまとめることになるのかというと、STATIC_ROOTに設定したディレクトリの下だ。ファイルをまとめるにはツールをつかう。コンソールで「python manage.py collectstatic」を実行すれば、静的ファイルをいろんな場所から、STATIC_ROOTで指定した場所に集めてくれる。
すでに存在するファイルがあるときは、上書きしていいか「yes」か「no」で答えろと迫られる。処理を自動化したい場合は、「python manage.py collectstatic --noinput」としておけば黙って上書きしてくれる。

なんでcollectstaticするのかというと、アプリが複数個あったりプラグインを追加していたりして静的ファイルがいろんなところに散らばっているからだ。
では、collectstaticしたときに、どのディレクトリのファイルを集めてくるか?
ひとつは INSTALLED_APPSで指定したアプリのstaticディレクトリ。
あと、STATICFILES_DIRSに追加指定したディレクトリも対象となる。STATICFILES_DIRSには、タプルで複数の場所を登録できる。

Webサーバーの設定だが、Apacheの場合は、次のような感じだろう(仮に、STATIC_ROOT='/var/www/django/myproject/staticfiles/';とする)。
Alias /static/ /var/www/django/myproject/staticfiles/
<Directory /var/www/django/myproject/staticfiles>
    Order deny,allow
    Allow from all
</Directory>
Djangoの開発サーバーの場合は、urls.pyに、
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
とやっておけば大丈夫だと思う。

2012-10-04

DjangoでImageFieldやFileFieldが空でないか調べる

たとえば、次のようなモデルがあったとします。
class MyModel(models.Model):
    thumbnail = ImageField(upload_to="path", null=True, blank=True)

ここで、ImageFieldにファイルがセットされているかどうか見分けて処理を切り替えたい場合の判定方法ですが、単に、
m = MyModel.objects.get(id=1)
if m.thumbnail:
    file_is_set() #ファイルあり
else:
    file_is_empty() #ファイルが空
という具合に判定すればOKなようです。

2012-03-10

Bing Translator APIのAccess Tokenをpythonで取得

こんな感じです。

import urllib

def _retrieve_access_token():
    data = dict(client_id="my_client_id",
                client_secret="my_client_secret",
                scope="http://api.microsofttranslator.com",
                grant_type="client_credentials"
                )
    data = urllib.urlencode(data)
    resp = urllib.urlopen("https://datamarket.accesscontrol.windows.net/v2/OAuth2-13", data)
    return resp.read()

もちろん "my_client_id" と "my_client_secret" の部分は、Azure Marketplaceで取得した値を設定しなくてはいけません。
それなりに時間がかかる処理なので、キャッシュを有効に使いたいところです。

戻り値は、
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Good afternoon</string>
のようにタグで囲まれているので、ここから翻訳結果の文字列だけを取り出してやる必要があります。

2012-03-08

django-registrationの使い方

djangoでユーザー登録機能を簡単に追加できるプラグインdjango-registrationの使い方を調査中です。
pipからもインストールできますが、pipでインストールできる安定版バージョン0.7と、bitbucketでダウンロードできる0.8alpha-1とでは、だいぶ設定が異なるようです。

デフォルトでは次のように動作します。
  1. ユーザー名、メールアドレス、パスワードでユーザー登録情報が送信される
  2. Userオブジェクトが生成され(この状態ではis_activeがFalse)、ユーザーに確認メールが送信される。
  3. 確認メールの中のリンクがクリックされるとそのユーザーのis_activeがTrueとなってログインを行えるようになる

機能させるには、settings.pyの変更、DBの更新、urls.pyの変更、templateの作成の4つが必要です。

settings.py

INSTALLED_APPSに、"django.contrib.auth"、"django.contrib.sites"、"regstration"を記載します。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.sites',
    'registration',
    # ...other installed applications...
)
ACCOUNT_ACTIVATION_DAYS = 7 # One-week activation window; you may, of course, use a different value.
ACCOUNT_ACTIVATION_DAYS は、確認メールの有効期間(日単位)です。

urls.py

'registration.backends.default.urls' をincludeします。bitbucketでダウンロードできる最新版のバージョン0.8では次のようにします。
urlpatterns += patterns('',
    (r'^accounts/', include('registration.backends.default.urls')),
)
pipでインストールされるバージョン0.7では、'registration.backends.default.urls' ではなく 'registration.urls' としなければなりません。バージョン0.8で 'registration.urls' をincludeした場合は警告は出ますが一応動作はすると思います。

tempates

templateを作成するのはめんどうなので、手っ取り早く動作させたい場合は、以下でダウンロードできるテンプレートのどれかを使うと良さそうです。(ただし、バージョンごとテンプレートの使用が異なるようなので、正常に動作しない可能性が高いです。)
https://github.com/dokterbob/django-registration-templates (古い?)
https://github.com/banterability/django-registration-templates (使用可能な変数がコメントアウトして書かれているだけ)
https://github.com/yourcelf/django-registration-defaults (未確認)
https://bitbucket.org/cliff/django-registration-templates (未確認)

登録するユーザー情報が、ユーザー名とメルアドとパスワードだけでは足りないという場合は、UserProfileを使います。

2012-02-27

CentOS5にpython2.7をインストールする

たしかこんな感じでできたはず。

$ sudo yum install zlib-devel

$ wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
$ tar zxvf Python-2.7.2.tgz
$ cd Python-2.7.2
$ ./configure --with-threads --enable-shared
$ sed #zlib/zlib Modules/Setup
$ make
$ sudo make install
$ echo /usr/local/lib > /etc/ld.so.conf.d/python2.7.conf

2011-10-24

Django1.3の管理サイトが便利すぎる



Djangoの管理コンソールは昔から便利だと思っていたが、久しぶりに最新版の1.3.1を試してみたら、管理コンソールが進化してものすごく便利になっていた。

とくに、ユーザが自分で生成したオブジェクトだけを表示・編集できるようになったことはすばらしい。
バージョン1.3がリリースされてから、かなり時間が経つが、ドキュメントが日本語化されていないようなので、このことを知らない人もいるかもしれない。
以前の管理コンソールは、すべてのオブジェクトにアクセス可能なサイト運営者用にしか使えない印象だったが、いまはサイトにユーザ登録した利用者用にも使えそうだ。

ユーザが生成したオジェクトのみを管理サイトでアクセス可能にするには、django.contrib.admin.ModelAdminを継承してたクラスを定義して、queryset、has_add_permission、has_change_permission、has_delete_permissionなどをオーバーライドする。querysetをオーバーライドするだけで、表示を絞り込むことはできるが、has_add_permissionなどで権限を正しく設定しておかないといけない。
ドロップダウンリストなどに他のユーザのオブジェクトが表示されてしまうのを直したい場合は、さらに、formfield_for_foreignkeyなどをオーバーライドすればよい。

Djangoの管理サイトは、以前よりもさらに便利で強力になった。しかし、もちろんすべてのニーズを満たすというわけではない。
たとえば、list_filterで絞り込みを設定した場合にも、他のユーザのオブジェクトが表示されてしまうのだが、これを防ぐ簡単な手立てはどうやらなさそうだ。
また、DBのテーブルを列挙するページ構成は、ユーザにとって使い勝手が悪い場合が多そうだ。ページ構成は、オブジェクトの階層構造に対応していることが望ましいと思うのだが、これを実現するには割りと大掛かりなカスタマイズが必要になると思われる。

2011-10-22

MySQL-pythonをインストール

djangoをMySQLで動かすには、MySQLdbが必要みたいなので、
pip install MySQLdb
とか、
pip install MySQL-python
とか打ってみたのだがエラーになる。

次のサイトで見つけたwindows用のインストーラ実行したら無事にインストールできた。
http://servut.us/akx/2010/09/mysqldb-windows-binaries-python-26-27/



CentOSでも、pipを使うとエラーになってしまったが、
yum -y install MySQL-python
とやってインストールできた。

2011-10-05

Snow Leopard + python2.5に、PILとsslモジュールを入れる



MacBook ProにWindows7をインストールするために、Boot Campでパーティションを切ろうとしたら失敗したため、リカバリしてOSX Snow Leopardを再インストールすることになった。開発環境を再構築するのには時間がかかるし神経も消耗する。

Google AppEngine(Python)の開発環境を整えるのがとくに大変だ。PILとsslをインストールしようとしたのだが、easy_installを使っても、setup.pyを使っても失敗してしまった。昔どうやってインストールしたのかよく覚えていないが、gcc4.0を使ってコンパイルしたような記憶がおぼろげにある。おそらく、python2.5が古いXcodeでビルドされているため、gcc4.0を使ってコンパイルしないとインストールできないということなのだろう。

Xcode4にはgcc4.0が含まれていないので、まずはXcode3をインストールした(gcc-4.0のためだけにXcode3をまるごと入れた)。そして、
    export CC=/usr/bin/gcc-4.0
とターミナルに入力してから、easy_installやらsetup.pyやらを使ったら、なんとかインストールできたようだ。

2011-09-13

Pythonでsite-packagesの場所を調べる

シェル(ターミナル)で次のコマンドを打ち込めば、Pythonのsite-packagesの場所が分かる。

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

複数のバージョンのPythonがインストールされている場合は、「python -c」の部分を、「python2.5 -c」とか「python2.7 -c」とかにすればよい。

2010-11-24

appengine開発用にubutu10.4にpythonをインストールする

ubutu10.4で、google app engineの開発環境を整えようとしているが、思ったよりも厄介だ。
まず、python2.5をソースコードからビルドする必要がある。
だがこれだけでは不十分で、gzipのインポートに失敗してしまう。zlib1g-devをインストールした後でpython2.5を再インストールする。
すると今度は、sqlite2のimportでエラーになる。libsqlite2-devをインストールして、pythonを再インストール。
これでもまだダメで、AttributeError: 'module' object has no attribute 'HTTPSHandler'というエラーがでる。そこで、libssl-devをインストールして、pythonを再インストール。
とりあえずこれで動作するようになった。

Python2.5.2をソースコードをビルドしてインストールするには、次のコマンドを打ち込む。



sudo apt-get install build-essential gcc
cd Downloads
wget http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz
tar -xvzf Python-2.5.2.tgz
cd Python-2.5.2
./configure --prefix=/usr/local/python2.5
make 
make test 
sudo make install sudo 
ln -s /usr/local/python2.5/bin/python /usr/bin/python2.5

(間違ってるけど正しいの忘れた)