【Djnago】カスタムテンプレートタグ

 

project/app/ templatetagsフォルダ作成 — my_tag.py

 

my_tag.py


from django.template import Library, Node, Variable, VariableDoesNotExist, TemplateSyntaxError

register = Library()

@register.tag
def cut(value, arg):
return value.replace(arg, ”)

 

このテンプレートタグを使って、uuidの-をカットする例

 

template

var marker_icon_{{ uuid|cut:”-” }} = new google.maps.Marker({

 

 

【Bootstrap3】File Upload

<form method=”post” enctype=”multipart/form-data” role=”form” data-toggle=”validator”>

{% csrf_token %}
<p><input type=”file” name=”app_file”></p>

<div class=”row”>
<label for=”version” class=”col-sm-1 control-label text-right”>Version</label> –>
<div class=”col-sm-2″>
<input type=”text” pattern=”^[0-9]{1,}$” class=”form-control col-sm-2″ id=”version” name=”version” placeholder=”数値のみ” required >
</div>
<input type=”submit” value=”アップロード” class=”btn btn-primary btn-sm pull-left” >
</div>
</form>

【Django】Send Mail

setting.py
EMAIL_HOST = ‘domain name’
EMAIL_HOST_PASSWORD = ‘xxxxxxx’
EMAIL_HOST_USER = ‘xxxxxxx’
EMAIL_PORT = 25

 

xxx.py

from django.core.mail import send_mail

send_mail(‘Subject here’, ‘Here is the message.’,’from@mknod.jp’, [‘to@mknod.jp’], fail_silently=False)

 

【Django】migrate

【マイグレーションファイル作成】

python3 manage.py makemigrations <appname>
python3 manage.py migrate

 

吐き出されるSQLの確認

python3 manage.py sqlmigrate<appname> 0001

 

Mark migrations as run without actually running them

 

python manage.py migrate --fake <appname>

 

Server Memo

WAF  

Web Application Firewall

 

WEBアクセラレーション

webサーバーの代わりにクライアントのリクエストを受け付け、複数のサーバーに分散させるリバースプロキシ、さらにサーバーからのレスポンスをキャッシュする

 

フォワードプロキシ

反応の遅いwebサイトに代わり応答するもの(普通のプロキシ)

 

リバースプロキシ

クライアントのリクエストを中継し、他のwebサーバーへリクエストを振り分ける。(ロードバランサ)

 

WSGI

Python標準のwebserver

 

Gunicorn

軽量のWSGI

 

nginx

フロントエンドwebサーバー。webサーバーの代わりにクライアントのリクエストを受け付け、複数のサーバーに分散させるリバースプロキシ、さらにサーバーからのレスポンスをキャッシュする高速webアクセラレーター。

webサーバー以外の使い方として、WAF、SSL、リバースプロキシとして使える。

web–(https) — nginx — (http) — gunicorn(複数) — django — database

 

※参考

https://django-best-practice-ja.readthedocs.org/ja/latest/deployment/servers.html#nginx

AWS + python3 + django1.7

install

AWSで micro instanceを生成する。
Security GroupにDjangoを動かすポート(ここでは8000番)を開放しておく。(SSHのあるグループに追加)

AWSに接続しする。
$ chmod 400 xxxx.pem
$ ssh -i xxxx.pem ubuntu@xxx.xxx.xxx.xxx

python3に設定
~/.bash_aliases作成。
alias python=python3

source  ~/.bash_aliases
実行

※python3 コンパイルする場合は、下記実行

wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
./configure --prefix=/opt/python3.4
make
sudo make install

mysql install
sudo apt-get install mysql-server

起動・終了方法
sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql stop

django

pip3 install Django==1.7

※1.8はドライバ(mysql-connector-python)がまだ対応してない模様。

sudo apt-get install python-setuptools
sudo apt-get install python-mysqldb
sudo pip3 install mysql-connector-python –allow-external mysql-connector-python

プロジェクトの作成
$ django-admin startproject pm

setting.pyを編集
DATABASES = {
'default': {
'NAME': 'user_data',
'ENGINE': 'mysql.connector.django',
'USER': 'mysql_user',
'PASSWORD': 'priv4te',
'OPTIONS': {
'autocommit': True,
},
}
}

django起動
python manage.py runserver 0.0.0.0:8000

ブラウザからグローバルIP:8000にアクセス。

【python+django】 ファイル一覧取得

from django.conf import settings

一覧取得(フォルダ以下全て)

files = os.listdir(settings.BASE_DIR + "/exif/static/exif/")
for file in files:
print(file)

ファイル一覧取得(jpg拡張子のみ)
files= glob.glob(settings.BASE_DIR + "/exif/static/exif/*.*jpg")
for file in files:
filename = os.path.basename(file)
print(filename)

【Django】ajax sample

【url】

url(r’^_sample/$’, ‘_sample’),
url(r’^_sample_json/$’, ‘_sample_json’),

 

【html】

<!DOCTYPE html>

{% load bootstrap3 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
{% bootstrap_messages %}
{% load staticfiles %}

<html lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<meta charset=”utf-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<meta name=”description” content=””>
<meta name=”author” content=””>
<link rel=”icon” href=”http://getbootstrap.com/favicon.ico”>

<title>SENSOR NETWORKS</title>

</head>

<body data-spy=”scroll”>

<div class=”container”>
<h3>SAMPLE</h3>
</div>

<!– BUTTON –>
<form role=”form”>
<button id=”bt_json” type=”button” class=”btn btn-default”>modal</button>
<button id=”bt_django” type=”button” class=”btn btn-default”>django</button>
</form>

<!– DIALOGS –>
<div>
<div id=”dialog” class=”modal fade”>
<div class=”modal-dialog”>
<div class=”modal-content”>
<div class=”modal-header”>
<button type=”button” class=”close” data-dismiss=”modal” aria-hidden=”true”>&times;</button>
<h4 class=”modal-title”>User Information</h4>
</div>
<div id=”dymanic_data” class=”modal-body”>

<!– dynamic data –>

</div>
<div class=”modal-footer”>
<button type=”button” class=”btn btn-default” data-dismiss=”modal”>Cancel</button>
<button type=”submit” class=”btn btn-primary”>Update</button>
</div>
</form>
</div>
</div>
</div>

<!– javascript –>
<script src=”{{ STATIC_URL }}/static/js/jquery.min.js”></script>
<script src=”{{ STATIC_URL }}/static/js/bootstrap.min.js”></script>
<script type=”text/javascript”>

$(document).ready( function() {

$(‘#bt_json’).click(function(){

$.getJSON(“../_sample_json”, function(json){

buf = “”
buf += “<ul>”;
for(i = 0 ; i < json.projects.length; i++){
buf += “<li>”
buf += json.projects[i].name
buf += “</li>”
}
buf += “</ul>”;
$(‘#dymanic_data’).html(buf);
})
$(“#dialog”).modal(“show”);
})
$(‘#bt_django’).click(function(){

$(“#dymanic_data”).load(“../_sample”);
$(“#dialog”).modal(“show”);
})

})

</script>
</body>
</html>

 

【view】

def _sample(request):

objs = Project.objects.all().order_by(‘name’);
return render_to_response(‘sn/modal_project.html’, {‘object_list’: objs})
def _sample_json(request):

resp = {}
arr = [];
objs = Project.objects.all().order_by(‘name’);
for o in objs:
p = {}
p[‘name’] = o.name
arr.append(p);
resp[‘projects’] = arr

return HttpResponse(json.dumps(resp), mimetype=”application/json”)

 

【html】dynamic data

{{ object_list|length }}
<ul>
{% for o in object_list %}
<li>{{ o.name }}</li>
{% endfor %}
</ul>

 

【Django】テンプレートタグ

<% if  xxxx %> /<% else %> には:がつかないので注意。pythonと違う。

あと、<%endif %>が必要。

参考

http://docs.djangoproject.jp/en/latest/ref/templates/builtins.html#std:templatetag-if

 

<tbody>

{% for prj in projects_list.projects %}
{% if prj.groups %}
{% for grp in prj.groups %}
<tr>
<td >{{ prj.name }}</td>
<td >{{ grp.name }}</td>
<td >
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td >{{ prj.name }}</td>
<td >-</td>
<td >
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>

 

 

【Django】BootStrapをインストールする

djangoにbootstrapをインストール。

http://django-bootstrap3.readthedocs.org/en/latest/

 

$ pip install django-bootstrap3

Add to INSTALLED_APPS in your settings.py:

'bootstrap3',
templateに下記を追加する。
{# Load the tag library #}
{% load bootstrap3 %}

{# Load CSS and JavaScript #}
{% bootstrap_css %}
{% bootstrap_javascript %}

{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}

 

 

【python】関数Object

【Syntax】

def xxx(arg1,arg2,.....argn):
ステートメントブロック

i.e

def add(a,b):
return a+b

【呼び方】
print add(1,2)
3

print add('abc','def')
'abcdef'

型なしっていいんだか悪いんだかわからないけど、これ書いたときすごく便利な気がした。。

関数の変数代入(関数ポインタみたいなもの)
bdd = add
print bdd(10,20)

関数定義の切り替え。新しい。。
if a==1:
def func(x,y)
return x*y
else:
def func(x,y)
return x/y

print func(3,2)

【python】pythonの基本文法

ptthonシェルの起動と終了

$python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>exit()

エンコーディングの設定

# coding: utf-8


Numeric
string
list
tuple
dic
set

 

型(Numeric/)

1+1
2

2*3
6

2**3   2の3乗
8

10%3   
1

乱数
import randam
random.random
0.3345898739

random.choice([10,20,30])   このなかからのランダムチョイス
10

math
import math
math.pi
3.141592....

文字列(string)

a='CA'
a
'CA'
b="TX"
b
'TX'
c='ABC\'D'    エスケープ
c
'ABC'D'
a+b
'CATX'

a+b
'CATX'

a*2
'CACA'

インデックスアクセス
a[0]
C

a[1]
A

インデックスアクセス
a[-1]
A
a[-2]
C

部分文字列
hello='Hello'
hello[1:3]
'el'
a[3:]
'lo'
a[:-2]
'Hel'

string関数
len(a)        length
a.find('e')  find 'e'
a.upper()    大文字変換

オブジェクトの関数一覧表示
dir(a)

関数ヘルプの表示
help(a.find)

フォーマット
a='Hello'
'{0},world!!'.format(a)
'Hello world!!'

x=10/3
'{0:.3f}'.format(x)
3.333

'{0:.0}'.format(x)
3

'{:,}'.format(12345678)
12,345,678

リスト

要素の定義
l=[2,4,6,8,10]

要素の取得
l[1]
4

要素の取得
l[1:3]
[4,6]

結合
M=l+[1,3,5]
M
[2,4,6,8,10,1,3,5]

ソート
M.sort()
M
[1,2,3,4,5,6,8,10]

要素の追加
M.append(100)
[1,2,3,4,5,6,8,10,100]

要素を削除
M.pop(10)
[1,2,3,4,5,6,8,100]

LENGTH取得
len(M)
8

特定の要素のカウント
M=[1,1,1,2,3,4,4,5]
M.count(1)
3

タプル(構造体)

A = ('aiueo', 123)
A
('aiueo', 123)

x=A
x
('aiueo', 123)

a,b=A
a
'aiueo'
b
123

インデックスアクセスもできる。
A[0]
'aiueo'
A[1]
123

ただしこれは出来ない。
A[0]='kakikukeko'   <- ×

ディクショナリ(hush map)

A={'name':'miya','age':35}
A['name']
'miya'

空で定義
B={}
B['name']='abeshi'
B['age']='4'
B
{'name':'abeshi','age':4}

ディクショナリ関数表示
dir(B)

キー一覧取得  
B.keys()

値一覧取得  
B.values()

キーが有るかどうかチェック  
B.has_key('name')   <-あるとき
True
B.has_key('job')  <-ないとき
False 

Or
'name' in B    <-あるとき
True
'job' in B    <-ないとき
False

セット(リストをdistinctにしたもの。リストの中から重複された物をぬいたもの)

A=['a','b','a','c','c','c'];
B=set(A)
B
set('a','b','c')

setの演算
A=set('Hello')
B=set('World')
A=set(['H','e','l','o'])
B=set(['W','o','r','l','d'])

論理和
A|B
set(['H','e','l','o','W','r','d'])

アンド
A&B
set(['l','o'])

排他的論理和
set(['H','e','W','r','d'])

制御文

x=1   ;はつけないのが慣例(つけてもよい) 基本は1行 1ステートメント
y=2

if x>y:  コロンをつける事。if (x>y):でもOK
  print 'x is bigger'
else:
  print 'y is bigger'

インデントが重要
if a=1:
    print 'a is'
    print a
    print 'dayon'
else: 
    print 'a is'
    print a
    print 'janai-yo'

一行にまとめる
if a=1: print 'a is number 1.'

リスト定義(複数行またいでもOK)
L=[[1,2,3],[4,5,6],[7,8,9]]
M=[[1,2,3],
   [4,5,6],
   [7,8,9]]

例外

def detail(request, poll_id):
    try:
        p= Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_response('polls/detail.html',{'poll':p})

【python】djangoのinstall

sudo pip install mysql-python
pip install django

プロジェクト作成
django-admin.py startproject http_test
python manager.py runserver

OSX 9にVirtual boxにUbuntuをいれdjangoをインストールします。

 

・install virtual box

・install ubuntu-13.10-server.iso

http://www.ubuntu.com/download/server

・setup Ubuntu
http://itpro.nikkeibp.co.jp/article/MAG/20131119/518861/

Ubuntu serverはCUI。GUIをインストールするには下記を実行

$ sudo apt-get install ubuntu-desktop
$ startx

OSXからUbuntuにSShでつなぐ
[Ubuntu]
sudo apt-get install openssh-server

[VirtualBox]

network settingから、NATを選択し、port  fowardingを設定して下記のように入力
スクリーンショット 2014-02-03 23.28.14

 

 

 

 

 

 

 

$sudo reboot

[OS X]

ssh -p 3022 user@127.0.0.1

pythonと、mysqlをinstall

$ sudo apt-get install python-mysqldb

djangoのinstall

sudo apt-get install python-django