2019年12月7日土曜日

Nextcloud Chromeでリダイレクトループが発生する

Nextcloudを使っているのですが、特にChromeでリダイレクトループが発生して困っていました。
Cookieをクリアすれば治るのですが、毎回そのようなことを使用者にさせるわけにもいきません。

Apacheのリダイレクト設定で以下の1行を追加して対応しました。
RewriteCond %{REQUEST_URI} !^/$  

例:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/$← 追加(無限ループ回避、トップページへのアクセスはリダイレクトをかけない)
RewriteRule https://www.hoge.com/
RewriteRule ^/(.*)$ https://www.hoge.com/? [R]


参考:Rewrite(リダイレクト) 無限ループの回避方法 | ex1-lab
https://ex1.m-yabe.com/archives/1226

2019年12月3日火曜日

Django CKEditorが動作しない

手っ取り早くCKEditorを使いたかったのですが、
AttributeError: module 'django.db.models' has no attribute 'RichTextField'
といういうエラーで動作しない...

from django.db import models
from ckeditor.fields import RichTextField

class Post(models.Model):
    post = models.RichTextField()

公式をよくみると、
post = models.RichTextField() 
ではなく、
post = RichTextField()
でした。
無事動作しました。

参考: Error while using ckeditor with Django version 2.x - Stack Overflow
https://stackoverflow.com/questions/53970050/error-while-using-ckeditor-with-django-version-2-x

Django urls.py 単純なリダイレクトの方法

redirectの使い方【パラメータの使い方の具体例もあります】 - code for Django
https://codor.co.jp/django/how-to-use-redirect

2019年12月1日日曜日

Django: サイトのドキュメントルートに静的HTMLファイルを設置する

[Django] Google Search Console などでサイトのドキュメントルートにHTMLファイルを設置する方法|カメラのちプログラミング♥ところによりカフェ
https://4to.pics/article/post/41

Django: 多言語化 デフォルト言語のみURLに言語コードを表示させない

パス接頭辞のないDjango i18nデフォルト言語 - コードログ
https://codeday.me/jp/qa/20190227/291424.html

デフォルト言語(日本語)URLは以下のようにして
sample.co.jp/

その他の言語のURLは以下のようにしたいとき。
・・・



DjangoのPermissionモデルを利用してViewを制限する - Qiita

Djangoでお問い合わせフォームをお手軽に実装する

Djangoでお問い合わせフォームをお手軽に実装する|カメラのちプログラミング♥ところによりカフェ
https://4to.pics/article/post/22

2019年11月23日土曜日

2019年11月10日日曜日

【Django】Model定義周辺の小ネタ - Qiita

ウェブサイトを丸ごと保存するフリーソフトHTTrack - 知的好奇心

Django Admin ウィジェットテンプレートの上書き

Django2.2でAdminのテンプレートをプロジェクト直下に持ってきて編集していたのですが、ウィジェットに関してはテンプレートが上書き適用できなかった。

調べたところなかなかややこしいですが、以下の方法でできました。

1.前提として、プロジェクト直下のtemplateディレクトリにパッケージのテンプレートをコピーして上書き適用するには、 settigs.pyに以下の設定が必要です。
settigs.py

TEMPLATES = [
    {
       ・・・・・・
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #★ここを変更
        'APP_DIRS': True,
       ・・・・・・  
    },
]

2.settings.pyに以下を追加する。

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

3.以下のような階層でdjango > forms > widgets ディレクトリを作りファイルをコピーする。

templates
├─admin
│  └─widgets
│          clearable_file_input.html #こちらのファイルを編集する
├─cms
├─django
│  └─forms
│      └─widgets
│              attrs.html
│              checkbox.html
│              checkbox_option.html
│              checkbox_select.html
│              clearable_file_input.html
                 #widgetsの中身を一式コピーしておく

とりあえずこれでOKでした。

参考:
Django、テンプレートファイルの探索順序について「ウィジェットテンプレートの上書き」
https://narito.ninja/blog/detail/135/  

2019年11月6日水曜日

Web API: The Good Partsを読んだまとめ - Qiita

python 組み込み関数を全て(69個)紹介する - Qiita

Vue.jsを習得するためにやった事 まとめ(随時更新) - Qiita

JavaScriptの配列操作

Windows10で2つのApacheが起動している

Windows10にApacheをインストールして、プロセスを確認してみるとApacheが2つあった。
おかしいなと思って調べてみるとWindowsではこれで大丈夫なようです。



Stackoverflow

Apache's documentation (https://httpd.apache.org/docs/2.4/platform/windows.html#page-header):

Because Apache for Windows is multithreaded, it does not use a separate process for each request, as Apache can on Unix. Instead there are usually only two Apache processes running: a parent process, and a child which handles the requests. Within the child process each request is handled by a separate thread.
https://stackoverflow.com/questions/40798483/why-apache-http-server-have-2-process-showing-on-task-manager

2019年10月31日木曜日

CentOS7 Mattermost 日本語全文検索設定

たてた Mattermost で 日本語全文検索 を可能にする - アレコレ・ティプス
http://asuki-yt.hatenablog.jp/entry/2018/04/03/200000

2019.10.31 現在、上記サイトの方法でできた。ありがとうございます。
CentOS7
MariaDB 10.1.30
Mattermost 5.16.1

私はMariaDB(MySQL)の設定については
/etc/my.conf に記述した。

2019年10月29日火曜日

CentOS7でDjangoとApache連携


CentOS7でDjangoとApache連携させて公開サイトにしようとしたら3日ほどもかかってしまいました...

1.CentOS7にPython2.7とは別途にPython3.7をインストール
これはわりとすなおにインストールできた。
参考:CentOS7にPython3.7をインストールする - Narito Blog
https://narito.ninja/blog/detail/20/

2.venv環境で mod_wsgi をインストール
これはインストールできなくて試行錯誤した。

3.以下のようなエラーでどうしても接続できない。
mod_wsgi: Exception occurred processing WSGI script '/var/www/python/myproject/mysite'
・・・
ModuleNotFoundError: No module named 'mysite'
(/var/log/httpd/error_logより)

最終的に以下をみつけて解決しました。

Python 3 + mod_wsgi + Django - おっさんプログラマの戯れ言
https://unk-pizza.hatenadiary.org/entry/20170601/p1

$ vim /var/www/python/myproject/mysite/wsgi.py

import os
import sys  # 追加

from django.core.wsgi import get_wsgi_application

sys.path.append('/var/www/python/myproject')          # 追加 sys.path.append('/var/www/python/myproject/mysite')   # 追加

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_site.settings")

application = get_wsgi_application()
os.environ.setdefault(・・・)を追加しろというサイトはあったのですが、ファイル末尾に追加してまったく効果がなくて、上記サイトをみてそのとおりに位置を替えたところOKとなりました。

4.DBが開けない
公開URLにしたらDBが開けない Unable to open database というエラーが発生。DBファイルへのパス設定が問題でした。

5.最後に静的ファイルの設定
このままだとCSSファイルやJSファイルを読み込んでくれないので、くずれた表示になります。
まず
$ python manage.py collectstatic
で静的ファイルを/STATIC/ディレクトリに集めます。

次に以下を参考にSTATICとMEDIAディレクトリをApacheで配信できるようにします。

静的ファイルのデプロイ

ファイルを配信する

以上です。

Django 公開URLにしたらDBが開けない

Django-CMSをセッティングして、開発用サーバー($ python manage.py runserver)では問題なかったのですが、Apacheで公開URLに切り替えたところ、

unable to open database file

とのエラー。このときはDBはsqliteでした。Googleでは、DBファイルのパーミッションを書き込み許可しろというようなことが多くでていましたが、パーミッションはOKなのでおかしいなとしばらく調べたところ、DB名設定にパスが必要なようでした。

setting.pyの以下を修正すると見事ログイン画面が表示されました。

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.sqlite3',
        'HOST': 'localhost',
        #'NAME': 'project.db', ##これを下に変更する
        'NAME': os.path.join(BASE_DIR, 'project.db'),
        'PASSWORD': '',
        'PORT': '',
        'USER': ''
    }
}


CentOS7 Python3.7 で mod_wsgi がインストールできない

CentOS7にPython3.7をインストールする - Narito Blog
https://narito.ninja/blog/detail/20/

上記を参考に、まずCentOS7にPython3.7.3を次のようにインストールした。

$ curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
$ tar xf Python-3.7.3.tgz
$ cd Python-3.7.3
$ ./configure
$ make
$ sudo make altinstall

上記でインストールすると、
$ python3.7 -m venv venv
後の仮想環境で、
(venv) $ pip install mod_wsgi
がエラーでインストールできなかった。
もう一度、./configure に --enable-shared オプションをつけてmakeをやりなおしてみた。
参考:https://qiita.com/methane/items/bf0b74550bee125cdea4

$ ./configure --enable-shared
$ make
$ sudo make altinstall

しかし、今度は ......soがないということでpython3.7自体が起動せず。
もう一度、altinstallをinstallにしたりして以下を実行した。

$ ./configure
$ make
$ sudo make install

すると、
(venv) $ pip install mod_wsgi

Collecting mod_wsgi
Using cached https://files.pythonhosted.org/packages/25/d8/1df4ba9c051cd88e02971814f0867274a8ac821baf983b6778dacd6e31f7/mod_wsgi-4.6.8.tar.gz
Installing collected packages: mod-wsgi
Running setup.py install for mod-wsgi ... done
Successfully installed mod-wsgi-4.6.8

あっさり成功した。。。

2019年10月18日金曜日

Django Modelで処理した後のデータをViewに渡す

DjangoでDBに保存したデータをTemplateで表示するあれこれについて · PengNote - 勉強した事や行った場所の感想を書くブログ
https://blog.daisukekonishi.com/post/django-display-on-template/

Djangoのobjectから属性1つのみ取得したい場合は flat=True を使う


file_s = Share.objects.filter(shared_user_id=log_id)

Djangoビューのfile_sからfiles_id属性を取得したいと思います。どうすればよいですか?

ベストアンサー
values()を使用して特定の属性を取得し、以下のように辞書のリストを返します。
file_s = Share.objects.filter(shared_user_id=log_id).values('files_id')

1つの属性だけ必要な場合は、flat = True を使用して値の一覧のみを返すようにできます。ただし、リストがどのような順番になるかを確認してください。

file_s = Share.objects.filter(shared_user_id=log_id).values_list('files_id', flat=True).order_by('id')

Django FileField/ImageField でアップロードした同一名のファイルを上書きするようにする

その名前のファイルが既に存在するときにDjangoがファイル名を変更しないようにするにはどうすればいいですか? - コードログ
https://codeday.me/jp/qa/20190329/495576.html

上記コードでは get_available_name() got an unexpected keyword argument 'max_length' というエラーが出たので以下を参考に少し改良しました。

django get_available_name() got an unexpected keyword argument 'max_length'

models.py に Class OverwriteStorage()とfs=・・・を追加して、
ImageField()内に storage=fs を追記します。

import os
from django.conf import settings
from django.core.files.storage
import FileSystemStorage

class OverwriteStorage(FileSystemStorage): 
     def get_available_name(selfname): 
         if self.exists(name): os.remove(os.path.join(settings.MEDIA_ROOT, name)) 
         return name

fs = OverwriteStorage(location=settings.MEDIA_ROOT)

class YourModel(models.Model): 
image_file = models.ImageField(upload_to='image/'storage=fs)

2019年10月15日火曜日

Django staticファイル まとめ - Qiita

How to build a File Manager Storage web app with Django

Part 1 — How to build a File Manager Storage web app with Django Rest Framework and Vue.js with Vuex and Ag-grid integration
https://medium.com/js-dojo/how-to-build-a-file-manager-storage-web-app-with-django-rest-framework-and-vue-js-e89a83318e9c

Django-filer をインストールしたが Tableがないというエラー

Django-filer をインストールしたのですが、以下のようなエラーが出て動作しません。

"Table 'PROJECT.filer_clipboard' doesn't exist"

DBにテーブルが作られていないようです。

一旦、以下のようにmigrateをリセットし、

python manage.py migrate --fake filer zero

migrateをやり直します。

python manage.py migrate filer

無事、以下のテーブルが作成されて動作しました!
filer_clipboard
filer_clipboarditem
filer_file
filer_folder
filer_folderpermission
filer_image
filer_thumbnailoption

2019年10月14日月曜日

Django Admin画面 高度なフィルタ作成 django-advanced-filters

Django Admin画面 フィルタ一覧をドロップダウンメニューにする

How to change the Django admin filter to use a dropdown instead of list? - Stack Overflow
https://stackoverflow.com/questions/5429276/how-to-change-the-django-admin-filter-to-use-a-dropdown-instead-of-list

Install:

pip install django-admin-list-filter-dropdown

Enable in settings.py:

INSTALLED_APPS = (      ...      'django_admin_listfilter_dropdown',      ...  )

Use in admin.py:

from django_admin_listfilter_dropdown.filters import (      DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter  )    class EntityAdmin(admin.ModelAdmin):      ...      list_filter = (          # for ordinary fields          ('a_charfield', DropdownFilter),          # for choice fields          ('a_choicefield', ChoiceDropdownFilter),          # for related fields          ('a_foreignkey_field', RelatedDropdownFilter),      )

Here's what it looks like:

Screenshot of dropdown list filter

2019年10月12日土曜日

Django テンプレートについて参考

Django 逆引きチートシート (Template編) - Qiita
https://qiita.com/uenosy/items/3c8e220a01ae21546e1c

DjangoでHTTPリクエストをHTTPSに強制リダイレクト

https://blog.sakaki333.com/blog/view/55

DjangoでHTTPリクエストをHTTPSに強制リダイレクト

settings.py に以下を追加する。

SECURE_SSL_REDIRECT = True

django-imagekit 参考サイト

django-imagekit – Djangoの自動画像処理。 現在v4.0 – GitHubじゃ!Pythonじゃ!
https://githubja.com/matthewwithanm/django-imagekit

サムネイル一括生成コマンド
$ python manage.py generateimages

参考:django-imagekit使ってみた
https://tanishiking24.hatenablog.com/entry/2015/04/07/135105

ResizeToFill以外のオプションは以下などがあります。

ResizeToFit
ResizeToFill
SmartResize
Adjust
TrimBorderColor
Transpose

参考:matthewwithanm/pilkit
https://github.com/matthewwithanm/pilkit

2019年10月4日金曜日

UbuntuのLive USBをつくるには

Ubuntuインストール用または一時的起動用のUSBは作れたのですが、USBから起動して、データもUSBに保存したりできるようにしたかった。
以下を参考にさせていただきました。

UbuntuのLive USBをつくる | MKTIAの備忘録
https://blog.mktia.com/how-to-make-ubuntu-live-usb/


2019年10月3日木曜日

Electron-builderでパッケージ化したLinux用ファイルの実行方法

Electron-builderで Linux用ファイル をパッケージ化すると、
・・・.AppImage
・・・.amd64.snap
というファイルができた。
Ubuntu上でどうやって実行するか分からず、調べてみると AppImage は以下のようにすればよかった。

You have to follow three simple steps to run an AppImage on Ubuntu Linux.
  1. Download .appimage package.
  2. Make it executable by following Right Click on software >> Properties >> Permission Tab >> Check "Allow executing the file as program.
  3. Now run the program.


snapファイルのほうは以下をみると、 インストールするタイプのようですがまだやっていません...

How to Install and Use Snap on Ubuntu 18.04


$ snap install <snapfile>

でエラー(error: cannot find signatures with metadata for snap "snapfile.snap")がでるときは、以下のようにすればよいそうです。

$ snap install --dangerous <snapfile> 

認証されていないプログラムなのでエラーになるようで、 --dangerous はそれを無視するオプションですね。

2019年9月19日木曜日

Django 突然MySQLにログインできなくなった

Djangoが急に動かなくなったので調べると、MySQLでログインできない...というようなエラーが出ていた。
パスワードも変えていないのに、なぜだろうかと思ったが、どうもよくあるエラー?のようだった。

Windowsだったので以下を参考にしてパスワードリセットして解決しました。ありがとうございます。

MySQLのrootパスワードを忘れた!ってときの対処法(Windows) - Qiita
https://qiita.com/Nekonecode/items/c44896105f1c2b22630e

2019年8月23日金曜日

JavaScript 数字文字列混在の場合のソート

【超簡単】正規表現を使った「数字を含む文字列」の配列内ソート - Qiita
https://qiita.com/yfujii1127/items/8d827a84e5fdd35871de


文字列に含まれる数字だけを基準にソートする

var words = ['abc131de', 'jklm243nop', 'qrs357tuv', 'f121ghi'];
words.sort(function(a,b){
    return a.match(/\d+/) - b.match(/\d+/);
});
console.log(words); // 結果:['f121ghi', 'abc131de', 'jklm243nop', 'qrs357tuv']

2019年8月20日火曜日

2019年7月29日月曜日

2019年6月22日土曜日

2019年6月21日金曜日

Django: DBをMySQLに変更する - pymysqlではなくmysqlclientを使う

実行日: 2019-06-21
Python: 3.7
Django: 2.1
MySQL: 5.7
OS: Windows10

DjangoのDBをMySQLに変更しようとネットで調べると、多くの記事では、
・PyMySQLをインストールしろ($ pip install PyMySQL)
・manage.py に import pymysqlとpymysql.install_as_MySQLdb()を記述しろ
とあるのですが、PyMySQLのバージョンが古いとのエラーになってしまいました。

以下を参考にすると、MySQL接続には PyMySQL ではなく mysqlclient  をデフォルトで使えとのことでした。

Django: エラー解決法 "raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; 〜)

$ pip uninstall pymysql ← pymysqlを削除しておく
$ pip install mysqlclient ←mysqlclientをインストール

※manage.pyには何も追記する必要はなし


基本作業は以下となります。

1.MySQLを公式サイトからダウンロードしてインストールする。
2.MySQLにパスを通す。(参考: https://webkaru.net/mysql/windows-confirmation/
3.settings.pyのDATABASEを以下のように編集する。

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample',  # データベース名
        'USER': 'rootuser',  # ユーザ名
        'PASSWORD': 'ZZZ',  # パスワード
        'HOST': '127.0.0.1',  # MySQLがあるサーバのIPアドレスやホストを。空欄はローカルホスト
        'PORT': '3306',  # 空欄はデフォルトポートの3306
    }
}

4.MySQLコマンドプロンプトでDBを作成する。
mysql> CREATE DATABASE sample;
※settings.pyで設定したNAMEと同じ名前のDBを作成

5.$ python manage.py migrate を実行する。

以上です。