Safariのオートコンプリート
ログインが必要なサイト内で、ログインフォームとは別の画面にtype="password"の入力フォームがある場合、ログイン時のユーザー名とパスワードが勝手に補完されるというケースがあった。
結果的に意図しないパスワードの更新が走ってしまうという、よろしくない不具合。
autocomplete="off"で補完を拒否できるらしい、というので設定してみたが効かない。
Safari: 一部の Web サイトでは AutoFill 機能がオフになります
Safari は、Web サイトの作成者が使用する AutoComplete="off" フラグを尊重します。
って書いてあるけど。バージョンが違うのか。。
ユーザー側では、Safariの設定で補完オフにすることができるが、公開サイトでユーザーが多数の場合などは、Safariの設定を強制できない。
以下のエントリで解決策が見つかってとりあえず凌げましたとさ。
Django Queryset AggregationでDBによって結果が異なるケース
DBがmysqlかsqliteかによって、テストが落ちたり成功したりするケースがあったので原因をメモしておく
- Max OSX 10.9.4
- MySQL 5.5.20
- python 2.7.5
- django 1.7
- MySQL-python 1.2.5
DateTimeFieldを持つモデル
from django.db import models class Entry(models.Model): last_updated = models.DateTimeField(auto_now=True)
aggregateした結果、
qs = Entry.objects.all().aggregate(Max('last_updated'), Min('last_updated')) print qs["last_updated__max"] print qs["last_updated__min"]
MySQLの場合
2014-09-23 04:34:32+00:00 2014-09-23 04:34:32+00:00
sqliteの場合
2014-09-23 04:33:54.706257+00:00 2014-09-23 04:33:54.706257+00:00
以上のようにMySQLの場合はmicrosecondが取得されていなかった
なので以下のサンプルのようなテストはsqliteでは通るがmysqlでは通らないことになる。
class EntryTest(TestCase): def test_save(self): entry = Entry.objects.create() qs = Entry.objects.all().aggregate(Max('last_updated'), Min('last_updated')) self.assertEquals(qs["last_updated__max"], entry.last_updated) self.assertEquals(qs["last_updated__min"], entry.last_updated)
本番で使用するDBで通るようにテストを書けばよいと思うけど、microsecondを0に合わせてやれば、mysqlでもsqliteでも通すことはできる。
class EntryTest(TestCase): def test_save(self): entry = Entry.objects.create() qs = Entry.objects.all().aggregate(Max('last_updated'), Min('last_updated')) expected = entry.last_updated.replace(microsecond=0) self.assertEquals(qs["last_updated__max"].replace(microsecond=0), expected) self.assertEquals(qs["last_updated__min"].replace(microsecond=0), expected)
カラムから特定の文字を取り除く
Replaceで
UPDATE person SET phone_number = REPLACE(phone_number, '-', '');
DjangoのQuerysetで同じことができないかどうか調べたけど無理だった。
Fがサポートするのは数値演算のみ
Query-related classes | Django documentation | Django
Pythonで日本の祝日判定をするスクリプト
Pythonで日本の祝日判定をするスクリプトを見つけたので触ってみた。
何故かsysとmathのimport文がないので追加した。
使い方はholiday_name関数にdateオブジェクト、もしくは年月日をintで渡すだけ。
以下の使い方サンプルはdateオブジェクトを渡している
# coding=utf-8 import jholiday import datetime target_date = datetime.date(2013, 12, 31) for i in range(0, 364): target_date += datetime.timedelta(days=1) holiday_name = jholiday.holiday_name(date=target_date) if holiday_name is not None: print target_date, holiday_name
実行結果
2014-01-01 元日 2014-01-13 成人の日 2014-02-11 建国記念の日 2014-03-21 春分の日 2014-04-29 昭和の日 2014-05-03 憲法記念日 2014-05-04 みどりの日 2014-05-05 こどもの日 2014-05-06 振替休日 2014-07-21 海の日 2014-09-15 敬老の日 2014-09-23 秋分の日 2014-10-13 体育の日 2014-11-03 文化の日 2014-11-23 勤労感謝の日 2014-11-24 振替休日 2014-12-23 天皇誕生日
Pythonでバージョンナンバーを比較する
2.6.4のようなバージョンを表す文字列を比較したい。
関連:MySQLでバージョンナンバーをソートする - brainstorm
pythonの場合はdistutils.verson.StrictVersionが使える。
ただしStrictVersionは"1"のように数字のみだとバージョンとして扱えず、ValueErrorになる。