2014年5月21日水曜日

Django、ユーザー認証

■概要

djangoのログイン認証を利用して楽をしたい!!

■環境

python
django
mysql

■問題

ログイン、ユーザー作成は提供されているViewの利用で問題ないが、
テンプレート側でユーザー等を利用したときに値がとってこれない。

■解決策

djangoのログイン認証の機構を利用するときには、
クラスビュー利用したあと、
setting.pyに
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    )
が必要。
上記設定後テンプレート側で
{{user.username}}{{messages }}
が利用可能に

■詳細はこちら

Python プログラマのための Django テンプレート言語ガイド
Always including the user in the django template context


2014年5月17日土曜日

Markdown2+pygments

■概要

markdownでcodehiliteを表現したい。

■環境

python
Markdown2

■Markdown2をインストール

ここから
>pip install markdown2

■pygmentsをインストール

ここから
>pip install Pygments

■python

markdownのextrasにfenced-code-blocksを入れる。
result = markdown2.markdown(
    self.planetext,
    extras={"wiki-tables",'fenced-code-blocks'}
    )
わかりにくいと思いますが
生成されるhtml(ソース)に
が出ていれば成功だと思います。

■markdown

```html

見出し h1

見出し h2

見出し h3

``` ```python if True: print('hi') ```
1行目コード範囲開始
8行目コード範囲終了
1行目、9行目で言語を指定

■html

色つけるのならCSSの追加が必要


css自体は以下などここら辺から入手
いい場所ほかにありそうですが・・・

■備考

正しいかどうか不明・・・
期待通りの色付けはできましたが、いい配色を探すのが難しいと思ったりしています。

■参考




2014年5月11日日曜日

Djangoメッセージフレームワーク

■概要

最近Djangoでシステム構築するとどうなるかと思いいろいろ試行錯誤中。
FlaskのFlushと同様のことDjangoで・・

■環境

Django[1.6.4]

■注意点

公式ドキュメントに記載されているsettings.pyの設定はstartappでほぼ入っていました。

■python/django/views.py

from django.contrib import messages
from django.shortcuts import render_to_response, RequestContext
# ...
def some_view(request):
    messages.set_level(request, messages.DEBUG)
    # ...
    messages.debug(request, '%s SQL statements were executed.' % count)
    messages.info(request, 'Three credits remain in your account.')
    messages.success(request, 'Profile details updated.')
    messages.warning(request, 'Your account expires in three days.')
    messages.error(request, 'Document deleted.')
    # ...
    return render_to_response('my_template.html',
      my_data_dictionary,
      context_instance=RequestContext(request))
1行目:messageのimport
2行目:RequestContextが必要
5行目:set_levelで利用可能なメッセージタグのレベルを設定。デフォルトはinfoのようです。(ここで詰まった)
7~11行目:それぞれのメッセージのテスト
15行目:requestをcontext_instanceに渡してやる必要あり。

■html


{% if messages %}
    {% for message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %}
4行目:タグの情報をそのまま、classに渡すと楽ですね。

■備考

以下の識別がしっくりきたのでメモ
DEBUG:
  開発用のメッセージ、本番環境では無視される(または削除される)
INFO:
  ユーザーに対して情報を伝えるためのメッセージ
SUCCESS:
  アクションが成功した、例) “あなたのプロフィールの更新が成功しました”
WARNING:
  失敗ではないが、その危険性がある
ERROR:
  アクションが成功していないか、何かの失敗がある

■参考

http://docs.djangoproject.jp/en/latest/ref/contrib/messages.html
http://www.18th-technote.com/post/5386511650/django

2014年5月8日木曜日

filterの登録

■概要

template側でフィルター(filter)を利用したい。
たとえば、変数内の改行を「<br />」に変更する。
jinja2の機能を利用

■python/flask

from jinja2 import Markup, Environment, FileSystemLoader, evalcontextfilter
from jinja2.utils import soft_unicode
@app.template_filter("nl2br")
@evalcontextfilter
def nl2br(eval_ctx, value):
    res = soft_unicode(Markup.escape(value)).replace("\n", Markup("\n"))
    if eval_ctx.autoescape:
        res = Markup(res)
    return res
env = Environment(loader=FileSystemLoader("."), autoescape=False)
env.filters["nl2br"] = nl2br
1,2行目:必要なメソッドをインポート
3,4行目テンプレートフィルターであることの宣言、evalの特殊処理であることの宣言
5行目;おまじない・・・
10行目、11行目:環境変数のフィルターに登録

■html

{{each['planecontent'] | nl2br}}
変数の後に「|」(パイプ)でつないで呼び出したいフィルター名を記載

Flaskでflashを使ってみる

■概要

一度テンプレート側で利用すると、セッション上から消えるメッセージをテンプレート側に渡せる
利用者に一度だけ伝えたい情報などを記載するのにてきしていると思われ。
具体的には、登録成功したよ~など


■メソッド

flush(messege,category)
 messege:内容
 category:属性
属性は省略可能、省略した時には「get_flashed_messages」の引数なしになります。

■注意点

セッションを利用するので、secret_keyの設定が必要

■python/flask

from flask import Flask, flash
app.secret_key = 'hogehoge'
def fileimport():
    result = []
    log = []
    if request.method == "POST":
        flash('Import file succece!', 'info')

    return render_template(
        'test.html',
        )

7行目で、flashにメッセージを登録しています。

■html

{% with messages = get_flashed_messages(category_filter=["info"]) %} {% if messages %}
    {% for message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %} {% endwith %}
2行目:flashからメッセージを取り出し 3行目:メッセージの有無を確認 5行目:メッセージをforで回して、6行目で描写 10行目:処理終了

2014年5月6日火曜日

FlaskでのWebサービスでの投げっぱなしのPOSTをやってみた。


■目的

画面更新せずに、データのみを登録したいという動きを
サーバー側Flask、クライアント側ajaxを利用した環境での実装を行う必要あり。

■問題

jQueryのajaxで呼び出したときに
データの登録のみをWebサービスで行いたいのに
Flask側で画面展開されてしまう。
Html側
$("#ajaxstart").click(function(){
  $.ajax({
    type: "POST",
    url: "/hoge/",
    datatype:"json" ,
    contentType:'application/json',
    data: {objid:$('form#hogehoge').attr('value'),
    }, 
  }).done(function(data, status, xhr) {
  }).fail(function(xhr, status, error) {
  }).always(function(arg1, status, arg2) {
  });
});

Flask,Python側
@app.route('/hoge/', methods=['POST'])
def hoge():
    # オブジェクトの入手
    objid = Mongodb().objectid(request.form['hogehoge'])
    response = Response()
    return response

■対策

返答するresponseにコンテンツはないことを明示的に表現する必要があり。
Flask,Python側
@app.route('/hoge/', methods=['POST'])
def hoge():
    # オブジェクトの入手
    objid = Mongodb().objectid(request.form['hogehoge'])
    response = Response()
    # ステータスコードは NoContent (204)
    response.status_code = 204
    return response

■参考

resoponse.status_codeはほかにもいろいろあるみたいです。
詳しくはここいらで。
本当に204で正解は少し疑問

Python の Flask で REST API を作ってみる
WikiPedia

■追伸

どうも違ったみたいです。
formのactionのpostと、.ajaxでリクエストが二つ飛んでいました。
postのほうが画面をredirectで作っていたようです。最終的にはstatus_code指定しなくても大丈夫でした。
教訓:submitは要注意、目指すページの構成によって使い分けるべし。



2014年5月1日木曜日

Webサービスの作り方

実装までの企画のすべて

  1. 哲学
  2. アイデア
  3. テーマ
  4. コンセプト
  5. 名前
  6. デザイン
  7. 内部設計

哲学

ここが持っている特定の興味関する揺るがない気持ち。生産の原動力

アイデア

実現するための手順、方法、複数あってもいい。切磋琢磨して残ったものを採用

テーマ

具体的に勝負する領域。どこを強みにするか。手を抜かない場所

アコンセプト

アイデアを実現するための骨格。他者に伝わるイメージ

名前

仮でもいいので早めにつける。名前をもって初めて見えてくるものもある。

デザイン

全体のディテールを決める。モックアップや同じテーマのプロダクトを調査
無駄なものをそぎ落とす

内部設計

内部的な実装を検討する。情報区分け、データモデル。物理実装ユースケースの作成など