スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    さくらインターネットpython2.6にアップ&django1.0対応

    0
       ひっさしぶりにdjangoとpythonを触りました。

      というのも、さくらインターネットさんがpythonを2.5→2.6とバージョンアップされて、自サイトが万年500エラー状態になってたのを発見したため、virtual-python環境構築しなおしの必要があり、ついでにdjangoのバージョンアップもやってしまえ!という状態になったからです^^

      参考URL
      http://djangoproject.jp/doc/ja/1.0/releases/1.0-porting-guide.html
      ドキュメント翻訳のymasudaさん&その他のdjango-jaの皆様、ありがとうございますm(_ _)m

      ・文字列をユニコードにする。特に日本語の文字列。("にほんご"→u"にほんご")
      ・models.pyで使わなれなくなったオプションを削除(edit_inlineとか;admin用のオプションを削れば取りあえずそのまま動くっぽい)
      ・(contrib.adminを使っている場合のみ)admin.pyを新しく作る
      ・(contrib.adminを使っている場合のみ)urls.pyを修正
      ・(form関係を使っている場合のみ)新しいdjango.forms対応で書き直す?

      とりあえず公開サイトとadminは元通り(?)動くようになりました。
      このサイトはmodel定義5個のみ&formとか使ってないので、修正はmodelとurlsのみで非常に簡単でした。
      作業時間15分ぐらい。

      感想:
      モデル数少なくてジェネリックビューor単純なビューだけなら移行は大したことない。
      form使ってたりmodel定義が多いと大変そう。
      リクエストとかレスポンスとか、DB APIを直接触ってたりとかすると、もっと大変そうーー;
      (まだ0.97preのまま放置中のモデル大量の自サイトがもう一個あるのよね…仕事暇になったらやろう…)


      さくらインターネットdjangoが突然500エラー!?(Pythonバージョンアップされてた

      0
         なってたのでびっくりしました。

        SSHで入ってpython -vしてみて納得。
        pythonが2.4.3→2.5.2になってました。いつからだったんだろう…
        独自ビルドをせずにvirtual-pythonを使ってたので、
        ・pythonのバイナリは2.5.2
        ・各種ライブラリは$HOME/lib/python2.4以下にあるので読めず
        な状態になっていた。

        1.とりあえず$HOMEでvirtual-pythonを再度実行。
        $HOME/lib/python2.5以下に標準ライブラリが配置されます。

        2.PIL,pysqlite2を再度インストール。

        3.$HOME/django_src/djangoへのシンボリックリンクを、$HOME/lib/python2.5以下に生成しなおし


        これでとりあえず回復しました。
        どーせだからdjango1.x系に変更しようかと一瞬思ったのですが、連休のため子供達の遊んでコールを無視できず断念……

        今のプロジェクト終わったら…といつものセリフを吐いて終わりにします(ダメ人間)


        久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)

        0
          JUGEMテーマ:インターネット


          あけましておめでとうございます…。
          超・ひさびさにdjangoを触ってはまったのでメモですー。

          実は今日、自分のメインサイトを某国内VPS→さくらと移転していたんですが、うっかりsvn coした最新版djangoを使ったら、HTMLテキストをそのままDBから読み出して表示していたところが全てエスケープされてしまった!

          焦ってdjangoの日本語ドキュメントを見に行ったけど、何も書いてない…。
          で、さらに焦って本家のドキュメントを見に行ったら答えがありました^^;
          http://www.djangoproject.com/documentation/templates/#automatic-html-escaping
          今後、{% autoescape off %}{% endautoescape %}で囲わないと、djangoのテンプレートシステムを使って出力する際、HTMLタグと思しき文字列は全てエスケープされるということらしいです。
          私みたいにw bodyにHTMLを直接書き込む癖がある人は気をつけましょう。

          他鯖においてるdjangoアプリもsvn updateするときは要注意…。
          新年早々お粗末さまでした。


          あと、django bookが新しくなった&全章揃ったみたいなので、そろそろ翻訳を直して公開しようかなー。なんちゃって(汗
          約2週間後〜2ヶ月間ほど、強制的に仕事ができない体になる予定なので、プリントアウトしておいてゆっくり翻訳やる予定です。(その前に誰かがやってくれてしまいそう><)


          django SQLiteでOperationalError: unable to open database file(久しぶりにdjango♪)

          0
            ここ1ヶ月、PHPの案件を2件抱えてたので、今日久しぶりにdjangoに触りました。

            すると、OperationalError: unable to open database fileというエラーが出て、どうやらSQLiteのDBファイルに書き込めないのが原因と怒られた様子。
            Linux使ってるときならともかく、今回はwindowsなのに(笑)



            さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ

            0
              自分の趣味サイトなら喜んであれこれ探求しますが^^; 急ぎだったので結局SQLiteを使って解決しました。
              結果、MySQL4.0系+utf8サイトは諦めたほうが早いかも??
              (このエントリーは次回さくら使用のお客様から依頼があったときのためにメモ)

              1.SSHでログイン。

              2.virtual-python http://peak.telecommunity.com/dist/virtual-python.pyとez_setup http://peak.telecommunity.com/dist/ez_setup.pyのイントール。

              3.sqlite3 http://www.sqlite.org/download.htmlのインストール。
              ./configure --prefix=$HOME
              make
              make install
              /home/****(さくらアカウント)***/bin/sqlite3にsqliteのバイナリができていることを確認。

              4.pysqlite http://initd.org/pub/software/pysqlite/releases/のインストール。
              微妙に最新版だとインストールでエラーになったので、2.2.2ぐらいまでバージョンを落としてみた。※今度時間のあるときに自環境でテストしてエラーが出ない最新verを探しましょう。。。

              5.あとはXREAの時と同じように、CGI版でdjangoを使うためのセットアップの続きをします。(最近Coreserverでdjango利用報告が増えてますが^^XREAとcoreは基本的に使い方が同じなのでXREAの方法で行けます。django製3サイトXREA→core移動済みの私が保証します。笑)


              普段MySQL愛好者の私にとっては、DBの中身がdjango.contrib.admin経由しか気軽に確認/修正できないというのは、実は非常に不安だったのですが^^;
              検索したらsqliteのコマンドラインの使い方が見つかったので、こちらを参考にさせていただいて、MySQLからエクスポート→SQLiteへインポート&定期dump(CRON使用)処理にも無事成功しました☆


              さくらインターネット スタンダードプランでdjango使ってる方、DBは?

              0
                偶々さくらをお使いのお客様からCMS/デザインの入れ替え(従来私がphp4で自作したものを使用していただいてました^^;)を依頼されてます。

                で、折角なのでdjangoで作ってみたんですが^^;
                DBがmysql4.0系なのが原因なのか、Unicodeエラーでさっぱり動きません。
                元のサイトには影響でないようにサブドメを切ってテストしてますが、さくらの共用鯖でdjangoを動かしている方々は、DBどうしてますか?

                一応解決策?としてsqlite3とpysqliteを自前でインスコ&sqliteで利用を考えてます。
                が、以前のmysqlのデータをインポートする必要があるため、phpSQLiteAdminで簡単に操作もできたらいいなーという超わがままな条件がありまして^^;

                php5.2.4をインスコした上で.htaccessを弄ってみましたが、phpSQLiteAdminは500エラーになってしまって動きませんでしたorz

                最悪の場合は手動でdjango.contrib.admin上で手動コピペするかなぁ…。


                クッキーを使わない認証できました!

                0
                  何とかできたようなので公開します★
                  everesさん、常山さん、ありがとうございましたm(_ _)m

                  セッションキーを取ろうとするとNoneが返ってきてうまく行かないので(saveする前にとってんのかな??)、結局ユーザーIDとパスワードをGETで持ちまわる形にしました。

                  ■デコレータ(見づらくてすみません)
                  前回everesさんに手直しして頂いたものを元に作ってます。

                  from django.contrib.auth import REDIRECT_FIELD_NAME
                  from django.contrib.auth.models import User
                  from django.http import HttpResponseRedirect
                  from myproject.lib.minihash import hash, hashdecode
                  from django.conf import settings
                  from urllib import quote

                  def login_required(view_func):
                  login_url = "/accounts/login/"
                  def _checklogin(request, *args, **kwargs):
                  if request.user.is_authenticated():
                  return view_func(request, *args, **kwargs)
                  else:
                  try:
                  request.META['HTTP_USER_AGENT'].index("DoCoMo")
                  user = User.objects.get(is_active=True,id=request.GET['user'])
                  if user.check_password(hashdecode(request.GET['pwd'])):
                  request.user = user
                  return view_func(request, *args, **kwargs)
                  except:
                  pass
                  return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, quote(request.get_full_path())))

                  _checklogin.__doc__ = view_func.__doc__
                  _checklogin.__dict__ = view_func.__dict__
                  return _checklogin

                  パスワードを生のまま持ってると何かと危険だと思うので、簡単ですが暗号化をかけてあります^^;
                  minihashというのが自作の簡単なhash化用モジュール(?)で、hash(暗号)・hashdecode(復号)という関数を入れてあります。

                  ■コンテキスト

                  def mobile_session(request):
                  try:
                  request.META['HTTP_USER_AGENT'].index("DoCoMo")
                  q = "?user=%s&pwd=%s" % (request.GET['user'],request.GET['pwd'])
                  except:
                  q = ""
                  return { 'q':q }

                  説明は不要かと思いますが、Docomo携帯でアクセス、かつGETでuserとpwdを持っていれば
                  それをqという変数に入れています。
                  何に使うかというと、ログイン後のページ遷移でuser/pwdを持ち廻るために、テンプレート内の全てのリンクタグ&FORMタグに追加しました。←これが一番面倒でした…


                  ■ログイン用ビュー
                  #ついでですが、newformsを使って自分で書いたものなので参考になるかと。


                  djangoでクッキー利用しない認証は可能か?(ドツボ中)

                  0
                    ここ2か月ばかり怒涛のように仕事と親戚付き合いに忙殺されてブログ書けませんでした。

                    ようやく一段落ついた、と思ったらまたハマったので「ヘルプ!」を兼ねてメモしときます。
                    djangoで作ったPC版コミュニティサイトに携帯サイトをつけようと思ったんですが、djangoのcontrib.authってクッキー必須なんですよね(http://michilu.com/django/doc-ja/authentication/)

                    で、クッキーの使える携帯(AU現行全機種&WILLCOM&SoftBankの一部機種)は問題なくエンコードとテンプレを変更するだけで使えるんですが、問題はi-mode様。
                    奴はクッキーが使えないので、login_requiredしてるビューがことごとくログインフォームにぶっ飛ばされて、その後ログインができない状態になります(当然)。

                    自分の携帯はAUなので、自分で使うだけならいいんですが、i-modeで使いたい人がいるので、「GETでセッションIDを持ってる人」かつ「リモートアドレスがi-mode」の人を対象に、特別なログイン方式を使いたいと思ってるんです。

                    最初に考えたのが、
                    ★ドコモ携帯用のビューを全部新たに書いて、login_requiredを外し、1回1回GETをチェック。→→書くビューの数が膨大になり、非常にめんどくさい。が、確実に実装できそう。

                    面倒なのはいやなので次に考えたのが
                    ★login_requiredデコレータをカスタマイズ。user.is_authenticated()をチェック→認証不可ならGETのセッションIDをチェック→両方外したらログインに飛ばす というmyprj.myapp.mydeco.login_requiredを書き、現行ビューのインポート先をcontrib.auth.decoratorsから変更する。
                    →→デコレータの書き方さえできれば、楽に実装できそう。

                    で。
                    早速やってみたんですが、結論としてうまくデコレータが書けず、エラーでドツボにはまってます。(´・ω・`)
                    とりあえずdjango.contrib.auth.decorators.user_passes_testを参考に、

                    from django.contrib.auth import REDIRECT_FIELD_NAME
                    from django.contrib.auth.models import User
                    from django.contrib.sessions.models import Session
                    from django.http import HttpResponseRedirect
                    from urllib import quote

                    def login_required():
                    login_url = "/accounts/login/"
                    def _dec(view_func):
                    def _checklogin(request, *args, **kwargs):
                    if request.user.is_authenticated():
                    return view_func(request, *args, **kwargs)
                    else:
                    try:
                    request.META['HTTP_USER_AGENT'].index("DoCoMo")
                    data = Session.objects.get(pk=request.GET['sessionid']).get_decoded()
                    user = User.objects.get(id=data['user_id'])
                    return view_func(request, *args, **kwargs)
                    except:
                    pass
                    return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, quote(request.get_full_path())))
                    _checklogin.__doc__ = view_func.__doc__
                    _checklogin.__dict__ = view_func.__dict__

                    return _checklogin
                    return _dec

                    というデコレータを書いたら、djangoのエラー画面で「login_requiredは引数を持たないって書いてるけど引数1個もらっちゃってるよ!」と怒られました。

                    じゃあ。ということで
                    def login_required()を
                    def login_required(request)とか
                    def login_required(view_func)とか
                    色々変えてみたんですが、今度はdjangoのエラー画面まで行かず500エラー。
                    エラーログを見るとresponseオブジェクトがどうのこうので怒られてる様子。

                    GETで持たせるのをセッションIDを持たせる形じゃなくて、携帯の無料HPスペース系にありがちなユーザ名&簡単にハッシュしたパスワードにする形も考えたんだけど、このデコレータでつまづいてる限りそれも無理だよねー。
                    認証バックエンドとかミドルウェアの類から自分で書かないとダメ??
                    ああ困ったな。誰かヘルプw


                    …携帯版だけPHP手書きで書き直そうかどうしようか、一瞬本気で悩んだ。
                    一度djangoのテンプレート継承の楽さに慣れてしまったらsymfonyとかPHP手書きには戻れないorz

                    そして、djangoはフレームワークというものの教育用には良いけれど(例:強制的にMVC(MTV)を分離させてくれる等)、CMS系用途に限定して使ったほうがいいのかなと思ったw
                    トリッキーなハックをしなくて済むように、もう少し自由度がほしいというか。


                    携帯サイト開発者はdjangoのunicodeブランチを入れると幸せになれるかも♪(DBと違う文字コードでサイト公開@django)

                    0
                      以前、djangoでUTF-8以外の文字コードでサイト公開と題して、UTF-8でDBから読み出しした文字を表示直前にSJISに変換するフィルタを公開しましたが、最新SVN版に含まれるようになったUnicode機能?を使うとこのフィルタが不要になるようです。

                      先日偶々svn upしてプチはまりした鯖(django管理画面でUnicodeErrorでまくり参照)、実は携帯サイト用のテストサイトを置いていた鯖(↑↑のフィルタを試した鯖)でもあったのですw

                      で。案の定(?)携帯表示テスト用サイトでもエラーが出ていて…
                      内容が「テンプレートをロードしたけど、UTF-8コーデックで読めないよ!」でした。
                      前回のエントリーでは、
                      ・テンプレ→SJISで書く
                      ・DB→UTF-8
                      ・テンプレに渡す変数→テンプレ内でSJISに変換
                      と面倒な処理をフィルタ作ってやらせてましたが、どうやら「テンプレ→SJIS」の部分がひっかかったご様子。

                      私はろくにドキュメントも読まずに「まずやってみる」主義なので(爆)、「これはもしかして、テンプレをUTF-8で書いておけば、settings.pyに指定したCHARSETにdjangoが自動変換してくれるってこと??」と期待して、テンプレのエンコーディングをSJIS→UTF-8変更しました(extends使って拡張しまくってるのでファイル数多くてなかなか大変)。

                      ドキドキしながら見てみると…
                      おお!SJISで表示OK!(携帯からも確認。)

                      結論。
                      Unicodeブランチありのdjangoを使っている場合に、違うエンコーディングでサイト公開したい場合の解決法。
                      ■settings.py→DEFAULT_CHARSET='sjis'を入れる
                      ■テンプレ→UTF-8で書く。前回のフィルタは不要。但し、metaタグでエンコーディング指定をする場合は忘れずにshift_jisを指定。(テンプレのプレビューをブラウザで事前にする人は要注意)
                      だけでいいみたいです。

                      おおーぐっと楽になるぞー。
                      Unicode入れちゃって後悔してたけど、良いこともありました^^
                      他の鯖も早めにmodelを修正して最新版にsvn upしちゃおうかなー(オイオイ
                      #人柱になるのが好きな奴だな、私w


                      svn upして焦った!(django管理画面でunicode errorでまくり)

                      0
                        何の気なしに、しばらくsvn upしてなかったから〜とsvn upしてびびりました。
                        管理画面でUnicodeError出まくり。

                        あわてて検索して、Django開発版にunicodeブランチがマージされましたを読み(多謝!)、早速Wikiの指示通り__str__を__unicode__に直したところ、とりあえず管理画面のエラーは治りました。

                        これから同じ鯖内に置いてある(同じdjangoを使ってる)全モデルの緊急チェックです(苦笑
                        といっても「__str__」→「__unicode__」全置換だけですが。


                        一応__str__を使ってるところだけが問題みたいなので、実際のサイト上で__str__を使ってない私にとっては、当分アチャーとなるのは管理画面だけかな??

                        あー焦った。
                        ひとまず、他の鯖は当面svn upを凍結して、修正後にします(笑



                        PR

                        calendar

                        S M T W T F S
                         123456
                        78910111213
                        14151617181920
                        21222324252627
                        28293031   
                        << May 2017 >>

                        twitter

                        selected entries

                        categories

                        archives

                        recent comment

                        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
                          プログラマー
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          ななうぇぶ
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • WindowsのPCで開発するphperがxhprofを使う方法
                          ななうぇぶ
                        • WindowsのPCで開発するphperがxhprofを使う方法
                          川本
                        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
                          よし
                        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                          77web
                        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                          ktz

                        recent trackback

                        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
                          常山日記
                        • django対symfony 日本語メール送信(その1 symfony編)
                          CPA-LABテクニカル
                        • CodeIgniterでユーザー認証
                          されどLAMPな日々
                        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
                          常山日記
                        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
                          サーバー用語集
                        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
                          常山日記
                        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
                          mitszoの日記
                        • python多次元リストをsort(並べ替え)する方法?
                          mitszoの日記
                        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
                          Humming Via Kitchen
                        • 日本語テキストをtruncate@django(Python全般にも??)
                          常山日記

                        recommend

                        links

                        profile

                        search this site.

                        others

                        mobile

                        qrcode

                        powered

                        無料ブログ作成サービス JUGEM