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()はなにをしているのかを説明
関数定義
ここでは、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()を使っている。
参考にさせていただきました。
WordPressマルチサイト機能による多言語対応 xserver
まずサーバーパネルでSSLの設定をする
xserverはサブフォルダ型
xxxx/ja
xxxx/en
のようにサブフォルダのように表示される
バックアップを取っておくこと
公式サイトはこちら
SSLの場合最初にWordPressアドレスをhttpsに変更しておく。
マルチサイトにすると変更できなくなるため
wp-config.phpの設定を変更
下記を追加
define ('WP_ALLOW_MULTISITE', true);
管理画面をリロードすると、
ツール>サイトネットワークの設置
というのが表示されるようになる。
Xserverはサブディレクトリ型を選択
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権限、 今後こちらでプラグインの追加やテーマの追加をする。
サイトの管理で新規言語サイトを追加できる
新規サイトの追加の記入例
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(アラモファイアー)のリクエストはこちら
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 インジケーター表示
これを表示するよ
ポイント
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 を利用する
swift alertを表示
こんなのを作ります。
ポイント
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) }