【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>

 

【PIL】 thumbnail作成時にOSError

PILでthumbnail作成時にOSErrorがでる。

デコーダーが入っていない可能性がある。

 

sudo apt-get install libjpeg-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libpng12-dev

sudo pip3 install Pillow

または、
sudo pip3 install -I Pillow

 

【python3】 Encode/Decode

ptint(‘xxx’)

UnicodeEncodeErrorで怒られたときの対処。

 

標準出力の文字コードを確認する。

print(sys.getdefaultencoding())
print(sys.stdout.encoding)

 

.bashrcに下記追加すればOK。

export PYTHONIOENCODING="utf-8”

 

クライアントから、spaceが+になって送られてくる場合は下記のようにする。

p_msg = urllib.parse.unquote_plus(p_msg)

 

【RPi】 GPIO

パッケージの確認
$ sudo apt-cache –names-only search gpio

 

【io.py】

#!/usr/bin/python

import RPi.GPIO as GPIO
import time

#GPIO.setmode(GPIO.BCM) # use GPIO pin number
GPIO.setmode(GPIO.BOARD) # use board pin number

GPIO.setup(40,GPIO.OUT)

try:
while True:
GPIO.output(40,True)
time.sleep(1)
GPIO.output(40,False)
time.sleep(1)

except KeyboardInterrupt:
print "detect key intr."

GPIO.cleanup()

 

実行

#sudo python io.py

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)

【Python3】virtualenv Python3環境へ切替える

Python 3 系移行のための仮想環境構築(MacOSX + Homebrew + Virtualenv)
http://salinger.github.io/python/20140208-virtpy23/

$ mkvirtualenv ENV_NAME で仮想環境作成
$ workon で仮想環境の一覧確認
$ workon ENV_NAME で指定の環境に入る
$ deactivate で仮想環境から脱出
$ rmvirtualenv ENV_NAME で仮想環境削除

【Python】Http POST/GET

Http/POST

import urllib
import urllib2

query = {"mail":"a@mknod.jp", "password":"123"}
query = urllib.urlencode(query)
resp = urllib2.urlopen("http://localhost:3000/api/login/", query)
resp.msg, resp.code

resp.geturl()
resp.info()

resp.read()
resp.realdline()

 

Http/GET

req = urllib2.Request("http://localhost:3000/api/project")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
req.add_header("Authorization", "Token f93768d4-13fd-4246-bd31-863e140bb1f3")
resp = urllib2.urlopen(req)
resp.msg, resp.code

 

【Python】preparate to use python module.

distribute for packaging

pip for easy installation/removal of packages
virtualenv for nice isolated environments

sudo apt-get install python-dev
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py

curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py
sudo pip install virtualenv

 

【タイムゾーン】sudo pip install pytz

【シリアル】sudo pip install pyserial

 

【Python】シリアル通信

【OS X】sudo easy_install -U pyserial

【Linux】apt-get instal python-serial

import serial
import pytz

def initSerial():

  com = serial.Serial( 
    port='/dev/ttyAMA0', 
    baudrate=9600,
    parity = serial.PARITY_NONE,
    bytesize = serial.EIGHTBITS,
    stopbits = serial.STOPBITS_ONE,
    timeout = None )
  return com


com = initSerial()
f = open('log.txt')
line = f.readline()

while line:
    com.write(line)
    line = f.readline()

【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>