2014年10月13日月曜日
PythonのWebフレームワークのトレンド
そこでGoogle Trendで簡単な検索をかけてみました。
なんと言うか、想像以上にDjangoの圧勝ですね。Flaskは少しずつ伸びていますが、Pyramidは一時盛り上がった後、収束してしまっています。 何か特別な理由が無い限り、とりあえずDjangoを選んでおくのが無難、と言うのが現実なようです。
2014年10月11日土曜日
Djang-CMSとFeinCMSの話
元々Django-CMSを使っているのですが、Versionが3.xになって、ページの編集方法がページの画面を表示した状態で編集したいところをダブルクリックして編集する、と言う形式になってしまいました。こういうWord的な編集方法、先進的に見えますけどどうも苦手なんですよね。
また、Chromeと相性が悪いらしく、まともに動作しないことが多いです。
そこでFeinCMSを試してみました。※インストール方法はこちらのWikiに記載しました。
FeinCMSはページの編集を普通のリッチテキストエディタで行うので分かりやすいです。
しかし、Django-CMSはインストールしたらそのまますぐに使える、いわゆるBattery includedな構造なのですが、FeinCMSはそうなっておらず、独自Modelの作成等をインストール後に行わないといけません。また、ドキュメントが少ないため、困った時にあまり情報が出てきません(Navigationを思った通りに表示させる方法が分からなかったり)。
そのため、Django-CMSとFeinCMSどちらが良いか、と言われると、内部を解析しながら使うつもりでない限り、Django-CMSの方がお勧めだと思いました。 ただ、Django-CMSは編集方法がどうも苦手なので、他のCMSももう少し調べてみようと思います。
2014年5月29日木曜日
PyPI XML-RPC解説
PyPIはXML-RPCに対応しており、xmlrpclibを用いることで、簡単にPyPIのデータを利用することができます。PyPIに利用可能なメソッドの説明はあるのですが、具体例は少ないので解説記事を作りました。
Updated: 本編をWebサイトからこちらに持ってきました。
基本的にこのページの和訳です。
- list_packages()
- package_releases(package_name, show_hidden=False)
- package_roles(package_name)
- user_packages(user)
- release_downloads(package_name, version)
- release_urls(package_name, version)
- release_data(package_name, version)
- search(spec[, operator])
- browse(classifiers)
- changelog(since, with_ids=False)
- changelog_last_serial()
- changelog_since_serial(since_serial)
list_packages()
PyPIに登録されちいるパッケージ一覧をパッケージ名のlistとして戻します。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> packageList = client.list_packages() >>> packageList ['0x10c-asm', '1009558_nester', '131228_pytest_1', '17MonIP', '18-e', '1ee', '1pass', '1to001', '2013007_pyh', '2C.py'... ] >>> len(packageList) 44313
package_releases(package_name, show_hidden=False)
指定されたパッケージのリリース一覧をlistとして戻します。show_hiddenがFalse(Default)の場合、隠されたリリースは含まれません。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.package_releases('Django') ['1.6.5', '1.6.4', '1.6.3', '1.6.2', '1.6.1', '1.6', '1.5.8', '1.5.7', '1.5.6', '1.5.5', '1.5.4', '1.5.3', '1.5.2', '1.5.1', '1.5', '1.4.13', '1.4.12', '1.4.11', '1.4.10', '1.4.9', '1.4.8', '1.4.7', '1.4.6', '1.4.5', '1.4.4', '1.4.3', '1.3.7', '1.3.6', '1.3.5', '1.2.7', '1.1.4', '1.0.4']なお、show_hiddenを設定する際、「show_hidden=True」と指定するとエラーとなるため、「True」のみを設定してください。
>>> client.package_releases('Django',show_hidden=True) Traceback (most recent call last): File "", line 1, in TypeError: __call__() got an unexpected keyword argument 'show_hidden' >>> client.package_releases('Django',True) ['1.6.5', '1.6.4', '1.6.3', '1.6.2', '1.6.1', '1.6', '1.5.8', '1.5.7', '1.5.6', '1.5.5', '1.5.4', '1.5.3', '1.5.2', '1.5.1', '1.5', '1.4.13', '1.4.12', '1.4.11', '1.4.10', '1.4.9', '1.4.8', '1.4.7', '1.4.6', '1.4.5', '1.4.4', '1.4.3', '1.4.2', '1.4.1', '1.4', '1.3.7', '1.3.6', '1.3.5', '1.3.4', '1.3.3', '1.3.2', '1.3.1', '1.3', '1.2.7', '1.2.6', '1.2.5', '1.2.4', '1.2.3', '1.2.2', '1.2.1', '1.2', '1.1.4', '1.1.3', '1.1.2', '1.1.1', '1.1', '1.0.4', '1.0.3', '1.0.2', '1.0.1']また、大文字小文字が区別され、存在しないパッケージ名を指定すると空のlistが戻されます。
>>> client.package_releases('django') []
package_roles(package_name)
指定されたパッケージのOwnerとMaintainer一覧をlistとして取得します。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.package_roles('Django') [['Owner', 'ubernostrum'], ['Owner', 'jacobian'], ['Maintainer', 'apollo13'], ['Maintainer', 'jezdez']]
user_packages(user)
指定されたユーザーのロール、パッケージ名のlistを取得します。 Package rolesがパッケージに対するロール、ユーザー一覧なのに対し、こちらはユーザーに対するロール、パッケージ一覧です。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.user_packages('ubernostrum') [['Owner', 'webcolors'], ['Owner', 'pownce-api'], ['Owner', 'django-registration'], ['Owner', 'django-profiles'], ['Owner', 'django-flashpolicies'], ['Owner', 'Django'], ['Owner', 'django-funserver'], ['Owner', 'django-contact-form'], ['Owner', 'mdn-sphinx-theme']]
release_downloads(package_name, version)
指定されたパッケージ、バージョンのダウンロードファイルとダウンロード数のlistを取得します。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.release_downloads('Django','1.6.5') [['Django-1.6.5.tar.gz', 85849], ['Django-1.6.5-py2.py3-none-any.whl', 63062]]
release_urls(package_name, version)
指定されたパッケージ、バージョンのダウンロード用urlに関する情報を、dictionaryのlist形式で戻します。 dictionaryとして戻されるのは以下の項目です。
- has_sig
- upload_time
- comment_text
- python_version
- url
- md5_digest
- downloads
- filename
- packagetype
- size
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.release_urls('Django','1.6.5') [{'has_sig': False, 'upload_time': , 'comment_text': '', 'python_version': 'any', 'url': 'https://pypi.python.org/packages/any/D/Django/Django-1.6.5-py2.py3-none-any.whl', 'md5_digest': '2bcdb4729f9f358b0925b532eef0a8ff', 'downloads': 63062, 'filename': 'Django-1.6.5-py2.py3-none-any.whl', 'packagetype': 'bdist_wheel', 'size': 6683598}, {'has_sig': False, 'upload_time': , 'comment_text': '', 'python_version': 'source', 'url': 'https://pypi.python.org/packages/source/D/Django/Django-1.6.5.tar.gz', 'md5_digest': 'e4c5b2d35ecb3807317713afa70a0c77', 'downloads': 85849, 'filename': 'Django-1.6.5.tar.gz', 'packagetype': 'sdist', 'size': 6633768}]
release_data(package_name, version)
指定されたパッケージ、バージョンに関する基本情報(URLや説明、先月のダウンロード数等)を取得します。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.release_data('Django','1.6.5') {'maintainer': None, 'docs_url': '', 'requires_python': None,...}
search(spec[, operator])
dictionary形式でSpecに指定された条件で検索を行い、条件にあったパッケージのdictionaryのlistを戻します。
- 'name': パッケージ名
- 'version': バージョン
- 'summary': サマリー
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.search({'name':['django']}) [{'_pypi_ordering': 0, 'version': '0.3.0', 'name': 'alpaca-django',...]
browse(classifiers)
指定された分類(classifier)に含まれるパッケージとバージョンの一覧を戻します。
classifier一覧
https://pypi.python.org/pypi?%3Aaction=list_classifiers
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.browse(['Programming Language :: Python']) [['pythonweb', '0.6.0'], ['mycloud', '0.51'], ['django-ship', '0.2.1']...]
changelog(since, with_ids=False)
sinceで指定されたtimestampから最新までの変更ログのlistを戻します。1つ1つのログは(name, version, timestamp, action)です。with_ids=Trueの場合、最後にserialが追加されます。また、timestampは全てUTCベースで、sinceは整数のみです。 以下は、今から1000秒前を起点として変更ログを戻しています。
>>> import xmlrpclib >>> import time >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.changelog(int(time.time()-1000)) [['arvados-python-client', '0.1.1401370328.82b4650', 1401370508,...]
changelog_last_serial()
最新のchangelogのserialを戻します。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.changelog_last_serial() 1107680
changelog_since_serial(since_serial)
指定されたserial以降の変更ログのlistを戻します。1つ1つのログは(name, version, timestamp, action, serial)です。
>>> import xmlrpclib >>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') >>> client.changelog_since_serial(1107670) [['infi.recipe.buildout_logging', '0.1.1', 1401370958,...]
2014年5月5日月曜日
DjangoでFormに初期値を渡す
Django 1.5系列で試していますが、それ以降でもおそらく変わらないはず。
方法:
form = forms.ProfileForm({"email":request.user.email,"language":profile.language})
以下、全体像です。
forms.pyでFormのclassを定義し、view.pyで初期値を入れたformを返しています。
#forms.py from django import forms from django.conf import settings class ProfileForm(forms.Form): email = forms.EmailField( label=_('mail address'), required=True, ) language = forms.ChoiceField( label=_('language'), required=True, choices=settings.LANGUAGES, )
#views.py @login_required def formProfile(request): profile = Profile(user=request.user,language=request.LANGUAGE_CODE) form = None if request.method == 'POST': form = forms.ProfileForm(request.POST) if form.is_valid(): profile.user.email=form.email profile.user.save() profile.language=form.language profilef.save() else: form = forms.ProfileForm({"email":request.user.email,"language":profile.language}) return render(request, 'profile.html', { 'form': form, })
2014年4月12日土曜日
Django CMS 3.0が正式リリースされたのだけれど
2014年4月5日土曜日
django-cms 3.0rc2をUbuntu 12.04にインストール
インストール中に質問される「django CMS version」で「rc」を選択しないとインストールに失敗します。
$sudo apt-get update $sudo apt-get install python-virtualenv libpq-dev python-dev libjpeg-dev libpng12-dev $virtualenv pyenv $source ./pyenv/bin/activate $pip install djangocms-installer $mkdir project_name $cd project_name $djangocms -p . project_name Database configuration (in URL format) [default sqlite://locahost/project.db]:[Enter] django CMS version (choices: 2.4, stable, rc, develop) [default stable]: rc Django version (choices: 1.4, 1.5, 1.6, stable) [default 1.5]: 1.6 Activate Django I18N / L10N setting (choices: yes, no) [default yes]:[Enter] Install and configure reversion support (choices: yes, no) [default yes]:[Enter] Languages to enable. Option can be provided multiple times, or as a comma separated list: en,ja Optional default time zone [default America/Chicago]: UTC Activate Django timezone support (choices: yes, no) [default yes]:[Enter] Activate CMS permission management (choices: yes, no) [default yes]:[Enter] Use Twitter Bootstrap Theme (choices: yes, no) [default no]:[Enter] Load a starting page with examples after installation (choices: yes, no) [default no]:[Enter]
参考;
https://www.digitalocean.com/community/articles/how-to-set-up-and-install-django-cms-on-a-debian-7-or-ubuntu-13-vps
https://github.com/divio/django-cms-tutorial/blob/master/Step%201%20-%20Initial%20Setup.md
2014年1月13日月曜日
Linuxのatコマンド
細かい書式はITProを見ていただくとして、時間指定は時刻だけでなく、今からx分後、と言った指定もできます。
また、atコマンドをそのまま利用すると、標準入力でコマンドを書き込むモードになりますが、下記のようにするとファイルの内容をコマンドとして設定できます。
$cat testCommand ls $at now+5minutes < ./testCommand
2014年1月12日日曜日
Pythonで作成したスクリプトをdaemon化する Ubuntu 12.04 - 14.04
Ubuntu 12.04以降(2015年2月時点で14.04までOK)でPythonで作成したスクリプトをdaemon化する場合、upstartに任せてしまうのが便利です。
サンプルはここに置きました。
参考:http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html
なお、upstartを利用しているディストリビューションでも、設定ファイルをインストールするフォルダが異なることがあるようなので、Ubuntu以外を利用している人は設定ファイルの保存先を変更してください。
upstart
Ubuntuではサービスの起動にupstartを利用できるようになっています。
upstartでサービスの起動を行う場合、以下のようなファイルを/etc/init以下に保存し、「/sbin/initctl reload-configuration」で設定を再読み込みします。
#/etc/init/python_daemon_example.conf description "python daemon example" author "ccat" start on runlevel [2345] stop on runlevel [016] chdir /usr/local/python_daemon_example exec python daemon.py respawn
cp ./python_daemon_example.conf /etc/init/python_daemon_example.conf /sbin/initctl reload-configuration