Djangoのバージョンの確認方法

pythonとターミナルで入力するとコマンドラインを実行できる >>>が表示される

$ python

Python 3.5.2 (default, Dec 20 2019, 17:56:26) 
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ここで

import jango

を入力 そして
get_version()関数を実行する

django.get_version()

>>> import django
>>> django.get_version()
'1.10'
>>> 

Djangoのバージョン1.10でした。

AttributeError: module Django.contrib.auth.views has no attribute

AttributeErrorが出たときの対応

url.py

from django.conf.urls import url
from . import views
from django.contrib.auth import views as auth_views

urlpatterns = [

    url(r'^$', views.home),

//ここが間違い
    url(r'^login/$', auth_views.login, {'template_name': 'useraccounts/login.html'}, name='login'),
    url(r'^logout/$', auth_views.logout, {'template_name': 'useraccounts/logout.html'}, name='logout'),
    url(r'^registration/$', auth_views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'),

]

解決法

from django.contrib.auth.views import LoginView

そして該当箇所を変更

  url(r'^login/$', LoginView.as_view(), {'template_name': 'useraccounts/login.html'}, name='login'),

このas_view()はなにをしているのかを説明

関数定義

github.com

ここでは、requestを受けとり、dispachメソッドを返却している。

  def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)

dispachメソッドは、リクエストメソッドを判定して、実装されていたら、それを実行する。

なので関数を返しているだけ。 そもそもとしてなぜこんなことをする必要があるかというと。 DjangoのViewは下記の3つの条件を満たさないといけないらしい。

  • requestオブジェクトを(第一引数として)受け取る
  • callableである
  • responseオブジェクトを返す

再利用可能なように、クラスベースのビューに変更になったようです。

これを満足させるために、as_view()を使っている。

参考にさせていただきました。

qiita.com

WordPressマルチサイト機能による多言語対応 xserver

まずサーバーパネルでSSLの設定をする
xserverはサブフォルダ型

xxxx/ja

xxxx/en

のようにサブフォルダのように表示される

バックアップを取っておくこと

公式サイトはこちら

wpdocs.osdn.jp

SSLの場合最初にWordPressアドレスをhttpsに変更しておく。

マルチサイトにすると変更できなくなるため f:id:happy_teeth_ago:20191226172153p:plain

wp-config.phpの設定を変更

下記を追加

define ('WP_ALLOW_MULTISITE', true);

f:id:happy_teeth_ago:20191226162118p:plain

管理画面をリロードすると、

ツール>サイトネットワークの設置

というのが表示されるようになる。

f:id:happy_teeth_ago:20191226172255p:plain

Xserverはサブディレクトリ型を選択 f:id:happy_teeth_ago:20191226164107p:plain

wp-config.php に追加

define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'tokutoku555.club');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

.htaccessへ追加

既存のWordPressの設定を置き換える(以前のものは削除すると言うこと)

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

これを書き換えると、再度ログインする。

サイトネットワーク管理が追加されている。 これがadmin権限、 今後こちらでプラグインの追加やテーマの追加をする。

サイトの管理で新規言語サイトを追加できる

f:id:happy_teeth_ago:20191226164339p:plain

新規サイトの追加の記入例 f:id:happy_teeth_ago:20191226164541p:plain

swift Alamofire login 忘備録

Alamofireはswiftyjsonと一緒に使うことが多い

Alamofireは、セッション等通信に利用する。

swiftyjsonは 受け取ったjsonレスポンスをswiftに取り込むためと考える。

理由は、jsonのファイルには、配列やオブジェクトが混じっていることが多いが、それをきれいに取り出してくれる仕組みがある。

ここのイニシャライザがわかりやすい。 github.com

SwiftyJSONの使い方

import SwiftyJSON

//こんな感じで利用
let json = JSON(data: dataFromNetworking)

let json = JSON(jsonObject)

Alamofire(アラモファイアー)のリクエストはこちら

github.com

Alamofireのリクエスト例

func request<Parameters: Encodable>(_ convertible: URLConvertible,
                                         method: HTTPMethod = .get,
                                         parameters: Parameters? = nil,
                                         encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,
                                         headers: HTTPHeaders? = nil,
                                         interceptor: RequestInterceptor? = nil) -> DataRequest

で実際のコード

//ログインを実装するよ
//@escapingは非同期や、他で参照される可能性があるということ。ここでは非同期のため。
   func login(userType: String, completionHandler: @escaping (NSError?) -> Void) {
        
     //パラメータ requestを生成するため
        let path = "api/social/convert-token/"
        let url = baseURL!.appendingPathComponent(path)
        let params: [String: Any] = [
            "grant_type": "convert_token",
            "client_id": CLIENT_ID,
            "client_secret": CLIENT_SECRET,
            "backend": "facebook",
            "token": AccessToken.current?.tokenString,
            "user_type": userType
        ]
        
//ここはリクエストなので、Alamofireを利用
       let request = Alamofire.request(url!,
                          method: .post,
                          parameters: params,

//ここはAlamofireのURLEncoding()を使うよ
                          encoding: URLEncoding(),
                          headers: nil)

        //投げたリクエストに対してのレスポンス処理 swiftyjson
        request.responseJSON { (response) in

//responseは .success と .failureが返却されるので、切り分ける
            switch response.result {

//レスポンスが帰ってきたときの処理
            case .success(let value):
                
//ここで上記のイニシャライザを利用
                let jsonData = JSON(value)
       
//.string!だけで string型にしてくれるだけでなく、nilのときは、そのまま空白を返却してくれる。落ちないので良い     
                self.accessToken = jsonData["access_token"].string!
                self.refreshToken = jsonData["refresh_token"].string!

//セッションが切れるときは、レスポンスのexpires_inに入っているよ
                self.expired = Date().addingTimeInterval(TimeInterval(jsonData["expires_in"].int!))
                completionHandler(nil)
                break

//だめだったときは、エラーをはく。チェックのため。
            case .failure(let error):
                completionHandler(error as NSError)
                break
                
            }
        }
      

objective-c 読み方

Objectiv-C 基本事項

@interfaceがheader部という。変数や関数名が記載されている。

@implementationが実装部で、実際の関数の定義が記載されている

@はコンパイラへの命令を意味します。

header部

@interface UIViewController(SWRevealViewController)

- (SWRevealViewController*)revealViewController;

@end

実装部

@implementation UIViewController(SWRevealViewController)

- (SWRevealViewController*)revealViewController
{
    UIViewController *parent = self;
//オブジェクトを生成 下記参照
    Class revealClass = [SWRevealViewController class];
    while ( nil != (parent = [parent parentViewController]) && ![parent isKindOfClass:revealClass] ) {}
    return (id)parent;
}

@end

オブジェクトを作るとき

オブジェクト = [ クラス名 初期化メソッド]

 //revealClass オブジェクトを生成
    Class revealClass = [SWRevealViewController class];

インスタンスを生成し初期化するとき

//dogにはDogクラスのインスタンスを作って初期化しなさい
dog = [[Dog alloc]init];


//このようにもかける
dogインスタンスには Dogクラスでインスタンス生成、メモリ領域を確保(ポインターという)*がつく
Dog *dog = [Dog alloc];

//生成したdog を初期化しなさい
dog = [dog init]

インスタンスは生成し、初期化しないと使えるようにならない。

ちなみにSwiftにはポインターは無い

便利ですね。

swift インジケーター表示

これを表示するよ

f:id:happy_teeth_ago:20191127180222p:plain

ポイント

1- UIActivityIndicatorViewでサイズを決めておく。

2- 他のプロパティ決めて、最後にaddSubviewする

CGRectは開始位置のx,yと大きさを決めるクラス

//ボタンが押されたとき
   @IBAction func btn_stop(_ sender: Any) {

//インジケーターサイズと大きさも決める、大きさは無視される
        let activity = UIActivityIndicatorView(frame:CGRect(x: 0, y: 0, width: 50, height: 50))
        activity.hidesWhenStopped = true

//場所は真ん中ですね。
        activity.center = self.view.center

//大きめのサイズにする
        activity.style = .large
        activity.startAnimating()

        //インジケーターが回っているときは、他のボタンはさわれない。
        view.isUserInteractionEnabled = false

//これは最後に追加
        view.addSubview(activity)
    }

ちなみに

endIgnoringInteractionEvents はiOS13より廃止になった

各画面が独立するようになった為

上記の view.isUserInteractionEnabled = false を利用する

developer.apple.com

swift alertを表示

こんなのを作ります。 f:id:happy_teeth_ago:20191127170331p:plain

ポイント

1- UIAlertControllerがベースとなるコントローラー

画面の大枠と考えると良い

2- UIAlertControllerにUIAlertActionでアクション(選択肢)を追加していく

userの反応を待つので、クロージャーを利用する クロージャーは、値が入るまで(ユーザーの反応が決定されるまで)実行されない。

3-present で表示してあげる

 @IBAction func myAlert(_ sender: Any) {
//まず外枠のインスタンスをつくる
        let alertController = UIAlertController(title: "alert desu", message: "are you sure?", preferredStyle: .alert)
       
//内側のokボタンを作成 クロージャー
        alertController.addAction(UIAlertAction(title: "ok", style: .default, handler: { (action) in
            print("pk pushed")
            self.dismiss(animated: true, completion: nil)
        }))
        
//内側のcancelボタンを作成 styleが cancelになる
        alertController.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: {(action) in
         print("cancel pushed")
            self.dismiss(animated: true, completion: nil)}))
        
//ここで表示してあげてる
        self.present(alertController, animated: true, completion: nil)
    }