Django 日本以外の場所からのアクセスを禁止する

備忘録です。

設定環境

CentOS

Apache

Django

mod_wsgi

 

今回はDjangoではなくApacheにて設定

 

http://www.cgis.biz/tools/access/

こちらのサイトからhtaccessをダウンロードさせていただきました。

 

そこから、

apacheの設定ファイルを書き換え。

 

今回djangoをApacheとmod_wsgiにて設定していた。

Apache側ではconf側のファイルをincludeするようにしていたので、ダウンロードした上記の設定ファイルに以下のように手を加えてincludeした。

 

冒頭に

<Directory “/var/www/html”>

まつびに

</Direvtory>

 

 

それをconf.dの中においてincludeさせた

 

 

 

Djangoでcanvasに描いたものを画像ファイルとして保存する

題名にもあるとおり、ドンピシャな記事がなかったので記事にしておこうと思います。

要は、DjangoのRestFrameWorkでAPIにてcanvasで描かれたものを画像データとして保存するというものになります。

まずは、HTMLですがこちらは単純にcanvasを使う形ですね。

<canvas id="canvas" width="1024"></canvas>

で、ここで書かれたデータを取得するのは、

const canvasImage = canvas[orbiter.getClientID()].toDataURL("image/png")

こんな感じで、toDataURLというものを使用することでcanvasのデータを取得することができます。

しかし、これはbase64なのでこのままAPIで送ってしまうと例えばDjangoのModelでカラムに画像のパスだけを保存しておくという場合には使用することができません。それはさておき、APIを飛ばす側ですが、jQueryで実装すると下記のような形。

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
                beforeSend: function (xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });


let fd = new FormData();
fd.append("filepath",canvasImageで取得したcanvasのURL);

$.ajax({
    'url': 'アップロード先のAPIのURI',
    'type': 'POST',
    'data': fd,
    'processData': false,
    'contentType': false,
    'cache': false,
}).done(response => {
    console.log('成功');
}).fail(function (data) {
    console.log('失敗');
});

 

DjangoでPOSTをする場合、CSRFTOKENがないとデータを投げれないので最初の部分ではその設定をしています。

なお、ajaxSetupはjQueryのslimなどでは動かないので注意が必要です。

 

で、肝心のDjango側を紹介しますと(モジュールのimport系は省略します)、

models.py

class CanvasImages(models.Model):
    file_path = models.ImageField(verbose_name='file upload', upload_to='lesson/canvas/')

こんな感じにしています。ImageFieldなのでBloBではなく画像のファイルパスをカラムに設定する一般的なものかと思います。

urls.py

router = routers.DefaultRouter()
router.register(r'upload_file', ImagefileuploadViewset)

urlpatterns = [
    path('', include(router.urls)),
]

RestFrameWorkの純正な書き方にしたがっています。

serializers.py

class ImagefilesCanvasSerializer(serializers.ModelSerializer, serializers.ImageField):
    class Meta:
        model = CanvasImages
        fields = ['file_path']

ModelSerializerを使用しています。

views.py

class ImagefileuploadViewset(viewsets.ModelViewSet):
    queryset = CanvasImages.objects.all()
    serializer_class = ImagefilesCanvasSerializer

    def create(self, request, *args, **kwargs):
        data = request.data.get('filepath')
        if data:
            data += "=" * ((4 - len(data) % 4) % 4)
            format, imgstr = data.split(';base64,')
            ext = format.split('/')[-1]
            canvas = CanvasImages()
            canvas.file_path = ContentFile(base64.b64decode(imgstr), name=str(uuid.uuid4()) + '.' + ext)
            canvas.save()
        return Response(data, status=status.HTTP_201_CREATED)

 

こんな感じになっています。createメソッドを拡張する形にはなっていますが、saveを行っています。

情報として少なかったのは、

data += “=” * ((4 – len(data) % 4) % 4)
format, imgstr = data.split(‘;base64,’)

ここら辺ですね。

実際にはファイル名にはuuidを用いて保存を行っています。

 

何かの参考になれば幸いです。

 

 

 

 

 

 

Django 日本語ファイルのアップロードでエラー(’ascii’ codec can’t encode characters in position)

centOSとApacheで構成しているサーバー環境で、Djangoで日本語ファイル(画像)をアップロードしようとすると、エラーが出力されてしまいました。

ちょっと苦戦したので、今回記事にしました。

 

【 エラー内容 】

エラー内容は、

‘ascii’ codec can’t encode characters in position

 

こんな感じ。

エラー見ただけでもわかりますが、encodeできないという内容みたい。もちろん、ローカルだと問題なく動いている。日本語のファイルのアップロードも問題ない。じゃあ、これをどうすればいいのかっていうのを調べてみた。

 

・Fixing UnicodeEncodeError for file uploads

https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/modwsgi/

Djangoの公式サイトにも記載されている通り、こういった文字コードの設定が必要ということ。

加えて、

・mod_wsgiで動かす時に、UnicodeDecodeErrorが出てしまう

https://qiita.com/kanjirz50/items/81104b60049ad7140b30

こちらの記事も参考にさせていただいた。

 

【 自分の環境だとどうするか 】

今回は、Apacheの設定環境などは特段難しいことはしていない。

でも、単純に参考サイトのように設定してもうまくいかなかった。

そこで、

LANG = 'ja_JP.UTF-8'

LC_ALL='ja_JP.UTF-8'

を設定した。これを設定する時のファイルは、[  /etc/sysconfig/httpd  ]

これをvimで開いて上記の設定を行った。

 

 

【 所感 】

このDjangoでの日本語ファイルのアップロードに関しては実はこれまでも悩まされていたところだった。フロント側のjsで日本語から英語へとファイル名を変更する方法も視野に入れて検討していたがスマートではないので、なんとかサーバー側にあげるときに日本語ファイルもアップロードさせたかった。

もし、同じ悩みを抱えている人がいるのであれば、上記の方法を試してみて欲しい。

 

 

【 追記 】

上記の内容からは若干それてしまうが、mediaをアップロードする先のディレクトリの権限も変更しておかなければならなかったので、併せて追記。

どのサーバーに設置するのかという点も併せてそれぞれの環境で違うとは思いますが、今回使用しているさくらVPSだと、mediaをアップロードする先のディレクトリの権限を変更しておかないといけなかった(GCPとかだとそもそもバケット側に保存するので不要か???)ので、この対応をして、きちんと日本語ファイルのアップロードができるようになりました。

めでたしめでたし。

 

ASUKARU(アスカル)の関東営業所が立ち上がりました。

日頃よりご愛顧いただきまして誠にありがとうございます。

この度、弊社(現在法人登記準備中)は、関東営業所を開設いたしましたのでこの場を借りてご報告いたします。

 

今後は、下記の通りになります。

 

今後とも何卒よろしくお願い致します。

 

ASUKARU 一同

画像認識 丸太の認識(opencv2)

asukaru 画像輪郭抽出
asukaru 画像輪郭抽出

 

 

どうも!こんにちは!

今画像認識を行なっています。今回は丸太の輪郭抽出です。

モジュールのバージョン

opencv-python 4.4.0.44

numpy 1.19.2

matplotlib 3.3.2

 

さて、今回使用する画像は、こちら

 

アスカル 木材の輪郭抽出
アスカル 木材の輪郭抽出

 

 

こんな感じの画像を使っていきます。

 

まずはインポートしてきます。

import cv2
import matplotlib.pyplot as plt

 

次に、cv2を使った画像の読み込みと、画像自体が大きいのでリサイズを行います。

img = cv2.imread('tikai2.jpeg')
img = cv2.resize(img, (300, 169))

 

さて、ここまで来たら毎度お馴染みの二値化をしていきます。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 0)
im2 = cv2.threshold(gray, 135, 169, cv2.THRESH_BINARY_INV)[1]

 

まずはこの画像を表示させてみましょう。

 

plt.subplot(1, 2, 1)
plt.imshow(im2, cmap="gray")

次のような白黒画像が出てくると思います。

opencv2 二値化画像
opencv2 二値化画像

 

ここから丸太の輪郭を検出していきます。検出した際には輪郭を白い線で塗り潰していきます。

cnts = cv2.findContours(im2, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)[0]

for pt in cnts:
    cv2.polylines(img, pt, True, (255, 255, 255), 3)

 

あとは、この線がひかれた画像を元の画像に合わせて表示させます。

plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGRA2RGB))
plt.savefig("ctns.jpg", dpi=200)
plt.show()

 

 

これで木材の輪郭を抽出することができます。が、ここで問題なのが全体的な輪郭の取得に差があることです。これをパラメーターを使うことで調整をしていくことになります。

その記事はまた後日追加していきます。

 

他のディレクトリからでもWPを使えるようにする。

WPはご存知の通り、その中で使われる関数をwp-load.phpで自動ロードしてきます。

なので、これを違うディレクトリからでも読み込むことで様々な場所からwpの関数を使用できるようになります。

 

たとえば、

root/

→wp-dir/ -wpが入ったディレクトリ

→asukaru_dir/ -作業ディレクトリ

となっていて、作業ディレクトリからwpディレクトリのwp-load.phpを使用するには、

require_once ‘../wp-dir/wp-load.php’

で読み込むことでwpの関数を使用できるようになります。

 

WindowsにXAMPPをインストールしてSQLを学習しよう

SQL_オンライン授業
SQL_オンライン授業

今回は、WIndows環境にXAMPPをインストールしてSQLを学習する動画を公開しました。

以前はWIndowsにXAMPP(ザンプ)をインストールするには各種の設定をしなければならないなどかなりの手間がかかっていたのですが今では本当に楽になりました。

このXAMPPですが、Apache、PHP、MariaDB、Perlのクロス(X)プラットフォームなのでそれぞれの頭文字をとってXAMPPと言われています。

これはこれで便利なものなので、初学の際には利用されるといいかなと思います。もちろん、各種の設定ファイルを書き換えてカスタマイズすることも可能です。

https://aspy.jp/member/movie/3

 

今回の学習環境は以下です。
・Windows
・XAMPP
・phpMyAdmin

 

さて、この動画でSQLの基本的なところを学んだあとは、さらに深く学習をしていきましょう!!

 

 

SQLは、どんなプログラミング言語を学んだとしても基本的にはくっついてきます

 

そのためしっかりと固めておかないと、セキュリティーに欠けたものや、何度もSQLを発行するという冗長なプロフラミングのソースコードを記述してしまい、とてもエンジニアとしては活躍をしていくことができません。

 

そのため、しっかりと押さえておいてください。

 

 

ASUKARUのプログラミングの学習動画一部改修のお知らせ

https://aspy.jp/

昨日リリースされたPythonをはじめとするプログラミングの学習動画ですが、こちらサンプル動画を見れるよう対応しました。

また、会員登録をしておくと新しい動画がアップロードされた際に通知がきます。

サンプル動画の一覧は、こちらから見れます。

https://aspy.jp/member/

ASUKARUのプログラミング動画学習サイト ーaspyに動画を追加しました。ー

こんにちは。

今日からアスカルのプログラミング学習サイトが立ち上がりました。まだコンテンツ自体は少ないですが、今後どんどん増やしていく予定なので楽しみにしていてください。

 

プログラミング学習動画サイトはこちら

 

今回の動画のサンプル版もYoutubeに上げています。

 

よければみていってください。

 

ところで昨日は、自作のルアーで池でテストを行なってきました。

流石は佐賀県神埼。

 

早速魚を仕留めることができました。

 

 

まだまだ雨の日が続いていますが、気分は晴れでがんばっていきましょう!

昼飯はマックにしよう!

 

 

MacにMysqlclientをインストールする

現在Djangoの開発をしており、ここではWindowsとMacと両方を使用して開発をしているのですが、
今回Macでmysqlclietnをインストールする時に嵌ってしまったので記事にしておきます。

出現エラーは、
(error: command ‘gcc’ failed with exit status 1)
こんな感じでした。

様々試してみたのですが、なかなかうまくいかず、結局公式サイトへ。

 

で、

PyCharmで仮想環境(venv)で作業をしていたので、そのままPyCharmのterminalから、以下のコマンドを

$ echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
$ export PATH="/usr/local/opt/mysql-client/bin:$PATH"
$ pip install mysqlclient

 

 

これで解消できました。

他の記事では、

 

LDFLAGS=-L/usr/local/opt/openssl/lib pip install mysqlclient

 

なども紹介されていますが、でもこれgccエラーではないですね。

かなりmysqlclientについて勉強になりました。まぁ、SSL等も必要ということですね。

では、開発を行なっていきたいと思います。