Pythonオブジェクト指向プログラミング
Pythonオブジェクト指向プログラミング、つまり、すべてのトランザクションをオブジェク トとみなす,
オブジェクト指向プログラミングは、あなたが神であり、あなたの周りに存在するもの がオブジェクトであり、それを作ることができる世界を作るようなものだ。
やや: プログラムのスケーラビリティ問題の終結
欠点: プログラミングの複雑さは手続き指向よりずっと大きい。
デザインパターン
シングルトンパターン:クラスにインスタンスは一つしかない
ファクトリーパターン:オブジェクトを生成するインタフェースを定義し、どのクラスをインスタンス 化するかはサブクラスに決めさせる。
デコレータパターン:オブジェクトに動的な責任を追加する
GIL
CPython インタプリタでは、マルチコアの利点を活かしてタスクを並列化すること ができないので、同時実行は単なる並行実行であり、本当の同時実行ではない
データの汚染やエラーの問題が発生したときに、マルチタスクによる共有データへの変 更が確実に行われるように、グローバルインタプリタは共有データに対するマルチタスク 操作をシリアルロックする
GILCPU に負荷のかかるプログラムはマルチプロセッシングで実装できる
haystack
haystackは全文検索を実現する Django プラグインで、django-haystack をインポートし、 INSTALLD で_APPS干し草の山'の価格で、次に干し草の山と他の関連する設定を追加する設定で
プロジェクト全体の url に検索関数の url パスを設定する
urlpatterns = [
...
url(r'^search/', include('haystack.urls')),
]
WSGI
ウェブサーバとウェブアプリケーション間の通信を記述する仕様。
WSGI serverクライアントからのリクエストを受け取り、リクエストをアプリケーションに転送し、 アプリケーションからのレスポンスをクライアントに転送する。
Djangoリクエストのライフサイクル
クライアントがブラウザでルートを入力すると、最初にローカル DNS サーバを呼び出 してドメイン名を ip アドレスに解決し、ブラウザで ip アドレスをルートとアクション、つまり get リクエストや post リクエストを WSGI、ミドルウェアを経由して取得し、最終的に指定された url に到達する。
ネットワークプログラミング
ウェブプログラミングと言えば、インターネットの階層構造が全てだ。
物理層、物理リンク層、ネットワーク層、ネットワークトランスポート層、 アプリケーション層
物理層はコンピュータのハードウェアである
物理リンク層でネットワークカードがあることを確認する
ip プロトコルの上のネットワーク層、コンピュータが ip アドレスを持つことを保証する
ネットワークトランスポート層の上には TCP/UDP プロトコルがある
アプリケーションの上は HTTP プロトコルだ
TCP/UDP プロトコルに関しては、3つのハンドシェイクと4つのウェーブがある。
3つのハンドシェイクとは、クライアントがサーバを起動してリンク要求を送信し、 サーバが要求に同意し、クライアントがデータを送信することだ。
4回手を振っている クライアントは、サーバーに切断要求を送信し、サーバーは、伝送が完了したためにあるときにチェックし、クライアントのリンクの直接切断がない、1万回の伝送が切断された場合、ある;サーバーは、切断要求を送信し、クライアントは、要求に同意し、これは、ネットワーク伝送の切断である
HTTP プロトコルといえば、クライアントとサーバ間でハイパーテキストを転送するた めにアプリケーション層で動作するプロトコルで、ハイパーテキスト転送プロトコルと呼ばれる
HTTPプロトコルの特徴
1 TCP/IP ベースのアプリケーション層プロトコル
2 リクエスト、レスポンスに基づく
3 ステートレス保存 self はリクエストやレスポンスの状態を保存しないので、セッションや cookie の誕生は保存されない。
4 : リンクあたりのリクエストを1回に制限し、答えを受け取ったら即座にクライアントを切断する。
Djangoミドルウェアへの5つの方法?Djangoミドルウェアのアプリケーションシナリオは?
DJangoでは、ミドルウェアは、実際にはクラスのメソッドは、ミドルウェア内の対応するメソッドを実行する適切なタイミングで独自のルールに従ってリクエストの最初と最後にされる
process_request: # メソッドはリクエストが来たら再度呼ばれる
process_response: # ビューデータの実行が完了した後、クライアントに送信された応答が時間を実行する場合でも、準備ができた。
リクエストが来たときやレスポンスが返ってきたときに何かしたいのであれば、ミドルウェアを追加するか、当然のことながらインターセプターを追加します。
FBVと CBV
FBVはファンクションベースのビューで、ビューはリクエストに統合されています。
CBVはクラスベースのビュー、つまりクラス継承ビューの内側のビューです。
CBVプログラムにデコレーターを追加する方法
# クラスに直接追加する
@method_decorator(wrapper,name='dispatch')
class Foo(View):
def get(self,request):
pass
def post(self,request):
pass
デコレータを追加する前に django からインポートする必要がある.utils.decorators import method_decorator
デコレータを追加するフォーマットは@method_decorator(),カッコの中はデコレータの関数名だ
クラスへの名前の追加は必須
csrf-token デコレータの特別な性質に注意してください。
Django ORM
django直接クエリされるオブジェクトはクエリセットオブジェクトで、通常はコレクションで ある
filter #
exclude #
annotate #
order_by #
reverse #
distinct() # クエリ結果から重複行を削除する
values # 繰り返し処理はモデルインスタンスオブジェクトではなく辞書を返す
values_list # 辞書の代わりにタプルを返す
django orm で sql を書けるようにする 3 つの方法
# 1 orm を使って直接実装する
Books.objects.filter(publish_name='大学出版部').extra(where={'price>60'})
# 2 生を使う
books = books.objects.rqw('select * from books')
# カスタム SQL
from django.db import connection
connection.curseor()
cursor = excute('elect * from hello_author')
cursor.fethome()
cursor.fintchall()
Fと Q の役割?
Fクエリでカラムの値を操作できる
from djangp.db.model import F,Q
Books.objects.ipdate(F('price')+20)
Q オブジェクトに対する複雑なクエリ % | ~not
search_obj=Asset.objects.filter(Q(hostname__icontains=keyword)|Q(ip=keyword))
valueと値_list
どちらもモデルオブジェクトを返しません。
valuesは辞書、values_listはタプルです。
django rom がデータを一括作成する方法
1 save() を使って、データが作成されるたびにデータベースにアクセスする
2 バルクを使う_create,sql クエリを減らす
querysetlist=[]
for i in range(10):
auerysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)
Djangoのキャッシュシステム
ホットデータ、頻繁に照会されるデータ、SMS認証コードなど。
キャッシュの設定
settings.py の CACHES にキャッシュを設定します。
1 pip install django-redis
2 設定で.pyDjango ORM で CACHES を設定する
3 SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
4 キャッシュを使う
from django_redis import get_redis_connection
con = get_redis_connection() # get をインスタンス化する_redis_connection
con.set(key,code) # キャッシュを設定する
con.expire(key,80) # キャッシュに空き時間を追加する
con.get(key) # キャッシュ内の値を取得する
db_firstそして最初にコード
db firstまずデータベースを作成し、モデルの生成を逆にする
code firstまずモデルを書いて、それからデータベースを生成する
データベースに基づいてMODを生成
python manage.py inspectdb
python manage.py inspectdb > blogapp/models.py
Django ormとネイティブSQLの長所と短所?
Djangoのormは、オブジェクトの移行を容易にするために、データアクセスの詳細を隠し、急速な開発の少し、データテーブルとオブジェクトモデルオブジェクトリレーショナルマッピングの実装に関連付けられています。
sqlの良いところは、複雑なクエリーをより簡単に実行できることです。
MVCと MTV
MVCとは、モデル、ビュー、コントローラのことです。
MTVはモデル、テンプレート、ビュー
レストフル仕様の知識について話してください
1 apiユーザと通信するためのプロトコル、常に HTTP プロトコルを使う
2 api インタフェースはドメイン名でデプロイしよう。
3 URL に api のバージョン番号を入れるべき
4 URLノードは名詞で表される
5 HTTP動詞 GET POST DELET PUT
6 ステータスコード 200 操作成功 201 新規ユーザの作成または変更成功
301 恒久的なリダイレクション 302 一時的なリダイレクション
400 クライアントエラー 401 許可がない 402 パラメータエラー 403 アクセス禁止 404 リソースが見つからない
500 サーバ側のエラー
インターフェイスの冪等性とはどういう意味ですか?
何度呼び出しても、getリクエストのように同じ結果しか得られません。
HTTPとHTTPSプロトコルの違い
httpはクリアテキストでデータを転送するため、支払いなどの機密情報の転送には適していません。
攻撃者がウェブブラウザーとサーバー間の送信メッセージを盗み出すと、その中の情報を読むことができます。
これらの欠点を解決するには、別のプロトコルを使用する必要があります。HTTPSプロトコルは、HTTPにSSLプロトコルを加えたもので、証明書によってサーバーの身元を確認し、ブラウザとサーバー間の通信を暗号化します。
HTTPは80番ポート、HTTPSは443番ポートです。
django modelsの null と blank の違い
nullはデータベース用で、null=Trueの場合、そのフィールドはデータベースでnullである可能性があることを意味します。
blankはフォームのためのもので、blank=Trueの場合、フォームに記入するとき、例えば管理インターフェイスの下でモデルのレコードを追加するとき、フィールドに記入することができないことを意味します。直感的には、このフィールドは太字ではありません。
ORM
1 外部キーを追加する
2 インデックスを追加する
3 重複クエリを避け、ホットデータのキャッシュを追加する
高い同時実行性と解決策
高い並行性:
複数のクライアントが同時にデータを取得できる。
1 フロントエンドのキャッシュから、スプライトグラフを設定する,
2 大きなファイルの圧縮
3 データベースとプログラムの間にレイヤを追加し、キャッシュとして redis を使うことで、 mysql データベースへの負担を減らす。
4 クエリ文を最適化し、インデックスを追加する
5 uwsgi を最適化する
6 nginxロードバランシング、リバースプロキシ
7 イメージや他のデータを oss に置く
頻度コンポーネントのカスタマイズ
例えば、1分間に3回の訪問制限
1 辞書を作成します。キーはユーザーのip、値はリスト、要素は時間です。
2 ipが辞書にない場合、ipを辞書に追加し、最初のアクセスを示すTrueを返します。
3現在のIPリストの周期的な判断は、現在の時間から最後のルックバックのリストを引くと、60秒よりも大きいので、テーブルには、訪問時間内に分されるように、データをポップオフです。
4 リストが3より小さいと判断した場合、Trueを返します。
5 判定は 3 に等しい , 扇風機は偽, ブロック
Django rest framework
ルーティング層
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('company',CompayVietSet)
ビュー層
from rest_framework import mixins, viewsets, status
from rest_framework.decorators import throttle_classes, action
from django.db import connection, transaction
class AccessoryViewSet(viewsets.ModelViewSet):
queryset = Accessory.objects.all().order_by('id')
serializer_class = AccessorySerializer
pagination_class = AccessoryListPagination
authentication_classes = (JWTTokenUserAuthentication,)
permission_classes = (IsAuthenticatedOrReadOnly,)
def get_queryset(self):
return queryset
#
@transaction.atomic
# FBV ビューの実装
@action(detail=False, methods=['GET', ], authentication_classes=[JWTTokenUserAuthentication, ], permission_classes=[IsAuthenticatedOrReadOnly, ])
def market(self, request, *args, **kwargs):
return Response({'code': '10001', 'data': {}, 'msg': str(e)})
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
直列化コンポーネント
from rest_framework import serializers
class AccessorySerializer(serializers.ModelSerializer):
accessory_img = serializers.CharField(read_only=True)
brand = serializers.SerializerMethodField()
class Meta:
model = Accessory
fields = ('id', 'category_name', 'accessory_img','brand')
def get_brand(self,obj):
return ''
モデル層
from django.db import models
class Company(models.Modesl):
cimpany_id = models.IntegerField(verbase_name='XXX')
class Meta:
verbose_name = 'sss'
verbose_name_plural = verbose_name
db_table='company'
ジャンゴの楽観的ロックと悲観的ロック
悲観的ロック:すべての操作は有害であると考え、まずロックを取得し、その上で操作します。
楽観的ロック:すべての操作は無害だと考え、最初に修正し、エラーが見つかったらロールバックします。
悲観的ロックの Django ORM 実装
from django.db import transaction
@transaction.atomic
def post(self,request):
# パラメータを取得する
# セーブポイントを取得する
sid = transaction.savepoint()
# データを書き込む
order_info = OrderInfo.objects.create(
order_id = order_id,
user = request.user,
addr = address,
pay_method = pay_method,
total_count = total_count,
total_price = total_amount
)
try:
# 作成したばかりのデータをクエリしてみる
except :
# セーブポイントへのロールバック
transaction.rullback(sid)
楽観的ロックの Django ORM 実装
from django.db import transaction
#
class OrderCommitView(View):
"""楽観的ロック """
# トランザクションデコレータを有効にする
@transaction.atomic
def post(self,request):
# パラメータを取得する
# セーブポイントを作る
sid = transaction.savepoint()
#データを書き込む
try:
pass
except:
# セーブポイントへのロールバック
transaction.savepoint_rollback(sid)



