Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

anaconda + django立ち上げ~json postまでの備忘録

今回はdjangoの立ち上げについて備忘録書いていきたいと思います。

ちょっと仕事?の都合上使わなければならなくなったのですが、いつも立ち上げに苦労するため備忘録として残そうと思いました!!
あと、今回はjsonデータのやり取りが必要になりそうだったのでそこまでを書いておこうと思います!!

環境はこちら。
 ・OS:Windows10
 ・python:3.7.4f:id:Elsammit:20200626140802p:plain
※anacondaを用いて環境セットアップを行っていきます。

django環境セットアップ


下記をdjangoインストールまでの流れはこちらを利用。
makimakimakino.hatenablog.com

まず、anacondaでanaconda Navigatorを立ち上げる。
f:id:Elsammit:20200626140503p:plain

左タブのEnviromentsをクリック。
仮想環境の一覧が表示されるため、下にあるCreateボタンをクリック。
f:id:Elsammit:20200626140802p:plain

名前をdjangoとし、Pythonのバージョンを選択しCreateを押下。
f:id:Elsammit:20200626141016p:plain

これで仮想環境の作成が完了。
仮想環境一覧画面にてdjangoを選択。
djangoをインストールするために、djangoパッケージをリストから検索。
もしなかった場合には、djangoの横にある三角矢印をクリックし、terminalを立ち上げる。

terminal立ち上がったら、こちらを実行。

pip install django


その後、anaconda navigatorの仮想環境一覧に戻り、"Update index"を押下。
※これをしないとインストールしたdjangoが表示されなかった。。。

再度検索を試みると今後はdjangoが表示されるはずので、チェックボックスにチェックを入れて右下Applyを実行。


これでdjangoパッケージのインストールが完了!!


djangoプロジェクト作成

先ほどのURLにはこの後、PyCharmというアプリをインストールして、、、と言いう記載がありましたが、、、、
使用しているPCのストレージの関係で取りやめました。

先ほどの要領でdjango仮想環境のterminalを立ち上げる。
もしくはanaconda Promptを立ち上げてこちらを実行。

activate django

djangoプロジェクト作成したいディレクトリに移動してから、djangoプロジェクト立ち上げコマンドを実行。

django-admin startproject プロジェクト名

実行が成功していれば、

プロジェクト名
|
|ープロジェクト名のフォルダ
|ーdb.sqlite3
|__manage.py

の構成のディレクトリが生成されます。


プロジェクト名まで移動してからこちらを実行。

python manage.py runserver

成功すると、

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

といったメッセージが表示されます。

適当なブラウザを立ち上げて、http://localhost:8000 もしくはhttp://127.0.0.1:8000/を入力してこちらの画面が表示されればプロジェクト立ち上げ成功です。
f:id:Elsammit:20200626143701p:plain

jsonデータをpost requestするまで

まずjsonデータをpost request/responseするための環境をセットアップします。
新しくアプリの作成を行います。

python manage.py startapp アプリ名

次にプロジェクト名のフォルダ配下にsettings.pyとurls.pyがあるのでこちらを編集していきます。

プロジェクト名のフォルダ
|
|ーasgi.py
|ーsettings.py
|ーurls.py
|ーwsgi.py
|ー__init__.py
|__ __pychache

まずsettings.pyからです。
settings.pyにINSTALLED_APPSがあるかと思いますのでこちらのように編集。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'webtestapp',
    'アプリ名' ,   ←こちらを追加。”,”を忘れずにつけること!!
]

次にurls.pyですが、こちらのように新しく作成したurlのパスをインクルードする

from django.contrib import admin
from django.urls import path, include ← includeを追記.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('アプリ名.urls')) ←追記.
]

次に先ほど追加したアプリについて編集いたします。
まず先ほど作成したアプリ名でフォルダが作成されているかと思いますのでフォルダを移動します。
views.pyを開き、こちらのようにソースコードを記載。

from django.shortcuts import render
from django.http import HttpResponse
import json
from django.http.response import JsonResponse
from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
# Create your views here.
def Send_PowerData(request):
    none = {"data:" "none":"none"}
    if 'json' in request.headers.get('content-type'):
        datas = json.loads(request.body)
        ret = {"data": "param1:" + datas["param1"] + ", param2:" + datas["param2"]}
        return JsonResponse(ret)
    else:
        return JsonResponse(none)

自分がはまった所は、
 ①@ensure_csrf_cookieがないと、ホスト側でKeyErrorが発生してしまう
 ②if 'json' in request.headers.get('content-type'):でjsonデータだった場合にjson.loadsをしないとエラーになってしまう
の2点です。
特に②は結構はまりました。。。

さらにアプリ名で作成されたフォルダ内にurls.pyを新規作成し、こちらのソースコードを記載。

from django.urls import path
from . import views

app_name = 'アプリ名'
urlpatterns = [
    path('send_power',views.Send_PowerData,name='Send_PowerData') ←Send_PowerDataにはviews.pyで定義した関数名を記載.
]

これでdjango側での実装は完了!!
最後に、

python manage.py runserver

を実行して下記が表示されればOKです!!

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

ホスト側の実装

ホスト側の実装はこちらのようにしました。

import requests
import json

url = "http://******" ← サーバサイド(django)までのパスを指定.
sess = requests.session()

csrftoken = sess.cookies['csrftoken']

headers = {'Content-type': 'application/json',  "X-CSRFToken": csrftoken}

jsn = {"param1": "AAA", "param2": "BBB"}

params = json.dumps(jsn )

res = sess.post(url, data=params, headers=headers)

最後に

一部躓いたところありましたが、比較的簡単に立ち上げられました!!
あとはホスト側でやりたいことを実装すればとりあえずは動くものが作れそう!!

だけど、、、
コロナのおかげ?で一時停止していたとある案件が再開してしまう。。。
色々なしがらみがあったり、お偉いさんの利権だらけで、操り人形感半端ないからやりたくないんだよな。。。無駄に時間使うし、、、よく分かっていない人たちが間に入るから説明とかめんどくさいし、生産性低いし、、、
前回のポケモンの続きをやりたいな。。。泣