Django RestでJsonデータを取り込む保存後変換しよとしたらエラーに
Django RestでJsonデータを取り込む
取り込んだデータをDBに書き込み、後でJsonを読み込んで
変換しようとしたらエラーになった
取り込んだ
post(self, request, format=None)
時点でJsonObjectになっているので
request.data
だと、シングルコーテーションになってしまう
JsonのStringにするには
json.dumps(request.data))
とする必要があった
class WebhookApi(APIView): def post(self, request, format=None): # d00=Tlog(json_string=request.data) # ↑↑ これだとNG d00=Tlog(json_string=json.dumps(request.data)) d00.save()
Django データベース操作
Djangoでのデータベースにかんするメモ
1,データを新規にレコード追加し、追加されたレコードのIDを取得する方法
p = Parent.objects.create(parent_name=”見出し”)
d01=Node(parent_id=p.pk,node_name=’小見出し’)
d01.save()
2,getとfilterの使い分け
絞り込んだデータが1つならget
pk指定なら確実、重複のない、フィールドに文字を指定してもいい
結果が複数あるならfilter
データがない場合もfilter
d00 = A.objects.filter(feald=’xx’)
if len(d00)==0:
データがない時の処理
3,複合しぼりこみは、カンマで区切る(and処理)
d00 = A.objects.filter(feald_a=’aaa’,feald_b=’bbb’)
AWS EC2、Amazon Linux2でDjango+Nginx+uWSGIをたち上げる
AWS EC2、Amazon Linux2でDjango+Nginx+uWSGIで
開発できるような環境を作ってみました
行う事
1,EC2インスタンス作成
2,SSH接続
3,OS最新にupdate
4,Pythonインストール
5,仮想環境(venv)インストール
6,PIPアップバージン
7,Djangoインストール
8,プロジェクト作成
9,マイグレーション
10,サーバ起動
11,外部アクセス確認
12、ポート解放
13、外部アクセス確認
14.Nginxインストール
15,Nginx外部接続確認
16,ポート解放
17,uWSGIインストール
18,終わりに
1,EC2インスタンス作成
まず、EC2のインスタンスを作成します。
https://console.aws.amazon.com/console/
「コンソールへ」からログイン
AWS のサービスのサービスのEC2を選択
インスタンスの作成
1年間無料版でまずは、ためしので、Amazon Linux2を選択します。
Amazon Linux 2 AMI (HVM), SSD Volume Type 64 ビット (x86)
を選択 タイプt2.microを選択
2,SSH接続
端末からSSH接続にて作業を行います。
キーをダウンロードして、キーファイルの設定として
属性を読み込み専用にして、
chmod 0600
SSHで接続します
ssh -i "ダウンロードキー.pem" ec2-user@(パブリックDNS名)
(パブリックDNS名)は、ec2-x-x-x-x.us-east-2.compute.amazonaws.com
のようなものです。
3,OS最新にupdate
sudo yum update
4,Pythonインストール
Gitをインストール
sudo yum install git -y
Gitでpyenv読み込み、Pathを設定する
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
関連をインストール
sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y
pythonをインストール
pyenv install 3.6.2
3分ぐらいかかる場合もあります
pyenv global 3.6.2 pyenv rehash python -V Python 3.6.2 ←表示
仮想環境構築と有効化
python -m venv env source env/bin/activate
pyenvを入れてから、venvで仮想は、なにか変な感じもしますが
venvで、バージョン毎の環境が作りやすいので。。。
6,PIPアップバージン
pip install -U pip
7,Djangoインストール
pip install django==1.11.17
インストールされたか確認
python >>> import django >>> django.get_version() '1.11.17' ←表示 >>> exit()
一応djangoのバージョンは1.11.17にしました
8,プロジェクト作成
django-admin startproject proj cd proj ls manage.py proj ←表示 cd proj vim settings.py
i 挿入モード(iを入力)
ALLOWED_HOSTS = [] 変更(25行あたり、全てOKで。。) ALLOWED_HOSTS = ['*']
ESC :wq (書き込み終了)
cd cd proj python manage.py makemigrations python manage.py migrate python manage.py runserver (パブリックDNS名):8000 http://(パブリックDNS名):8000
で、ブラウザでアクセスしてみる
時計が周り続けて、なにも表示されない「このサイトにアクセスできません」
ポートを開けないといけない
awsダッシュボードのセキュルティ-グループから
インバウンド編集、ルール追加、
プロトコール:TCP,ポート範囲:8000、保存
http://(パブリックDNS名):8000
で、ブラウザでアクセスしてみる
It worked! Congratulations on your first Django-powered page.
無事、Djangoの画面が表示された
14.Nginxインストール
python manage.py runserverで、キー入力できない時は
CTR-Cで、終了
sudo yum install -y nginx エラー To use, run # sudo amazon-linux-extras install nginx1.12
指示に従いこちらで
sudo amazon-linux-extras install nginx1.12
nginxを起動する
sudo systemctl start nginx
http://(パブリックDNS名)
で、ブラウザでアクセスしてみる
「このサイトにアクセスできません」
ポートを開けないといけない
awsダッシュボードのセキュルティ-グループから
インバウンド編集、ルール追加、80、保存
8000はそのままにしておく
(後で閉じるように)
http://(パブリックDNS名)
で、ブラウザでアクセスしてみる
Welcome to nginx on Amazon Linux!
nginxの画面
それでは、Djangoとnginxを繋げるためにuWSGIを使ってみる
17,uWSGIインストール
pip install uwsgi
https://qiita.com/xKxAxKx/items/da9dcc8caa36e1c303c7
を参考にして、
nginx.conf
を変更
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org バックアップしてから 編集 sudo vi /etc/nginx/nginx.conf
追加、削除を行う
http { . . . . include /etc/nginx/conf.d/*.conf; #以下3行追加 upstream app_server { server 127.0.0.1:8000 fail_timeout=0; } server { #以下4行はコメントアウト #listen 80 default_server; #listen [::]:80 default_server; #server_name localhost; #root /usr/share/nginx/html; # 以下3行を追加 listen 80; server_name (パブリックDNS名); client_max_body_size 4G; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { # 以下4行を追加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; }
ESC+:wq
で書き込み終了
sudo nginx -t
文法チェック
sudo systemctl stop nginx sudo systemctl start nginx
設定ファイルを修正したのでnginxを起動(一度停止してから起動)
cd cd proj uwsgi --http :8000 --module proj.wsgi
http://(パブリックDNS名)
で、ブラウザでアクセスしてみる
It worked! Congratulations on your first Django-powered page.
と表示された
18,おわりに
不要なポート閉じる
awsダッシュボードのセキュルティ-グループから
インバウンド編集、8000を削除、保存
AWSのEC2でftp接続する方法
EC2でftp接続する方法
EC2でプログラムを作る時、やはり使い慣れたftpで組んでいきたい。
EC2にftpサーバを立ち上げて、クライアンと接続してみる。
1,vsftpdのインストール
sudo su
yum install vsftpd -y
2,接続IPを調べる
SSH端末に入って
curl http://169.254.169.254/latest/meta-data/public-ipv4
参考
https://qiita.com/Yuki_BB3/items/deeb84c360c6f3c37f51
3,設定ファイルの変更(/etc/vsftpd/vsftpd.conf)
一応、原本を保存
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sudo vim /etc/vsftpd/vsftpd.conf
はじめから新規に作っていいのだが、
一度、全て消してみる
(dは行削除)
d10 ENTER
d10 ENTER
d10 ENTER
挿入モード i
以下をコピペ(端末なのでShift+Ctr+Vで貼り付ける)
(ElasticIPで登録したIPアドレス)
の部分は、3で調べたIPを設定
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=(ElasticIPで登録したIPアドレス)
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
seccomp_sandbox=NO
allow_writeable_chroot=YES
貼り付けたら
ESC :wq
で、保存してvimを終了
参考
4,ポートの設定
Amazonのダッシュ-ボードから、セキュリティーグループで追加
21,22,60000-6010
5,サービス起動
vsftを起動(一度止めてから起動)
sudo systemctl stop vsftpd
sudo systemctl start vsftpd
6,接続用アカウントにパスワード設定
sudo passwd ec2-user
パスワード設定
参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-password-login/
7,ftpクライアントからの接続
ftp (ElasticIPで登録したIPアドレス)または、DNS xxxx__us-east-2.compute.amazonaws.com
ec2-user
パスワード
8,接続完了
IPが変わったら、再度
/etc/vsftpd/vsftpd.conf
の変更と
サービス再起動が必要です。
IP固定でない場合は、インスタンスを停止、起動すると、新しいIPになります。
保護中: EC2でDjango+Nginx+uWSGIをたち上げる
Django DateTimeFieldで格納したデータをVeiwで文字列に変換すると時間がずれる
Django DateTimeFieldで格納したデータを
template側では、settingで指定した
タイムゾーンで表示されるが
Veiwで文字列に変換すると、時間がずれる
例
timedataにデータを読み込み、文字列に変換
strtimedata=timedata.strftime(“%H:%M”)
すると
9時間ずれる
astimezone(tz=None)
とすることで、解決した
strtimedata=timedata.astimezone(tz=None).strftime(“%H:%M”)
参考
https://qiita.com/popsuzuki/items/fea7c6639c5079a6408a
ImportError at /admin cannot import name ‘path’ from ‘django.urls’ (/home
Django 1.11.xx
から
Django 2.xx
に切り替えようとしたら
ImportError at /admin cannot import name ‘path’ from ‘django.urls’ (/home
とういエラーがでた
urlpatterns = [
url(r’^admin/’, admin.site.urls),
から、
urlpatterns = [
path(‘admin/’, admin.site.urls),
変更により、エラーが発生しています。
つまり、
Django 2.xx
の書式で、作成されているかれど
Djangoを読み込んでいるのが、古いDjango 1.11.xx
のPathになっていました。
パッケージの読み込みPathを正しくした所
解消しました。
DjangoでTempleteを読み込まない「TemplateDoesNotExist at」
settings.py
の
TEMPLATES = [
に
‘django.template.context_processors.static’, ##
を、追加で解決
TEMPLATES = [
{
:
:
:
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
‘django.template.context_processors.static’, ## ここを追加
],
},
},
]
ただし、厄介なのは、
一度、テンプレートを読み込めると
TEMPLATES = [
から
‘django.template.context_processors.static’, ## ここを追加
を、削除しても、読み込んでくれる。
読み込んだ実績を内部で管理しているのだろうか。
色々な所を、修正して、根本原因を整理したいような時
不具合の検証ができないため、苦労する。
./manage.py runserver
を、再起動しても再現しない
./manage.py makemigrations
./manage.py migrate
しなおしても再現しない
一度、dbを削除(db.sqlite3)して
./manage.py makemigrations
./manage.py migrate
しなおしても再現しない
設定後、戻す事はないかと思うが
別の所で、現象が出た時、元に戻してしまうと注意が必要。。
sublimeTextのメニューが急に中国語に
UbuntuにsublimeTextをインストールして
日本語へ設定して使っていたら、
急に、メニューが中国語に変わってしまった。
少しの間は、我慢して使っていたが
やはり使い難いので、調べた所
どうにか日本語になった。
メニューのヘルプ(H)の一番下の
LanguageからJapaneseを
選択したら、元にもどった。
どのタイミングで、不具合になったかは謎である。
今後の動きを観察してみたいと思う。