Django&DRF重點內(nèi)容大盤點

Django&DRF重點內(nèi)容大盤點

本文只是將學(xué)習(xí)過程中需要深刻記憶蔚晨,在工作中常用的一些命令或者知識點進(jìn)行一個羅列并闡釋呀洲,不會全面的將所有內(nèi)容進(jìn)行講解。大家可以在了解了Django框架和DRF框架之后再來看這邊文章。否則會有點不知所云但骨。

1.Django

1.1創(chuàng)建Django項目

這一命令必須熟記于心:

django-admin startproject 項目名

1.2 創(chuàng)建子應(yīng)用

1.在工作中我們要開發(fā)很多項目,肯定需要很多模塊智袭,創(chuàng)建子應(yīng)用肯定也需要掌握:

python manage.py startapp 子應(yīng)用名

注意:此命令需要在項目的目錄下進(jìn)行輸入奔缠。

2.創(chuàng)建完子應(yīng)用中之后,千萬不要忘記去INSTALLED_APPS中進(jìn)行注冊吼野,這個參數(shù)在setting文件中校哎。

1.3一個程序注意的點

1.3.1視圖函數(shù)的定義

1)定義視圖函數(shù)之后瞳步,要有一個request形參接收請求對象单起。

2)返回的時候用到了HttpResponse這一命令返回響應(yīng)對象

1.3.2url地址的配置

1.在子應(yīng)用中的urls.py文件中設(shè)置當(dāng)前子應(yīng)用中url地址和視圖對應(yīng)關(guān)系

urlpatterns = [
    url(r'^url正則表達(dá)式$',views.視圖函數(shù)名)
]

2.在項目總的urls.py文件中包含子應(yīng)用中的urls.py文件

urlpatterns = [
    url(r'^',include('users.urls'))
]

1.4url配置

在子應(yīng)用中進(jìn)行url地址的配置時,建議嚴(yán)格匹配開頭和結(jié)尾屈留,避免在地址匹配時候出錯局冰。

1.5項目配置項

1.BASE_DIR指的是Django項目根目錄

2.語言和時區(qū)本地化:

LANGUAGE_CODE = 'zh-Hans' # 中文語言
TIME_ZONE = 'Asia/Shanghai' # 中國時間

1.6客戶端向服務(wù)器傳遞參數(shù)途徑

1.6.1通過URL地址傳遞參數(shù)

在我們的url地址中的參數(shù)灌危,我們?nèi)绻胍@取可以在子應(yīng)用中的urls文件中進(jìn)行設(shè)置

/weather/城市/年份
url(r'weather/(?P<city>\w+)/(?P<year>\d{4})/$'views.weather)

1.6.2通過查詢字符串傳遞參數(shù)

# /qs/?a=1&b=2&a=3
def qs(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    alist = request.GET.getlist('a')
    print(a)  # 3
    print(b)  # 2
    print(alist)  # ['1', '3']
    return HttpResponse('OK')

重要:查詢字符串不區(qū)分請求方式赠摇,即假使客戶端進(jìn)行POST方式的請求藕帜,依然可以通過request.GET獲取請求中的查詢字符串?dāng)?shù)據(jù)。

1.6.3通過請求體傳遞數(shù)據(jù)

1)post表單提交的數(shù)據(jù)

/form/
def form_data(request):
    name = request.POST.get('name')
    age = request.POST.get('age')
    return HttpResponse('OK')

2)json數(shù)據(jù)

/json/
def json_data(request):
    req_data = request.body
    json_str = req_data.decode()
    req_dict = json.loads(json_str)
    name = req_dict.get('name')
    age = req_dict.get('age')
    return HttpResponse('OK')

1.6.4通過請求頭傳遞數(shù)據(jù)(了解即可)

1.6.5request對象的屬性

request請求對象的屬性 說明
GET 查詢字符串參數(shù)
POST 請求體重的表單數(shù)據(jù)
body 請求體中原始的bytes數(shù)據(jù)
method 請求方式
path 請求的url路徑
META 請求頭
COOKIES 客戶端發(fā)送的cookie信息
FILES 客戶端上傳的文件

1.7相應(yīng)對象構(gòu)造

1.7.1響應(yīng)時返回json數(shù)據(jù)

def get_json(request):
    res_dict = {
        'name':'xiaoyan',
        'age':'18'
    }
    return JsonResponse(res_dict)

1.7.2響應(yīng)時進(jìn)行頁面重定向

def redirect_test(request):
    # 第一個參數(shù)是namespace,第二個參數(shù)是name
    req_url = reverse('users:index')
    return redirect(req_url)

1.8狀態(tài)保持之session

1)將session信息保存到redis中

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

2)設(shè)置session

request.session['<key>'] = '<value>'

3)獲取session

request.session.get('<key>')

1.9類視圖

1.9.1類視圖的使用

1)定義類視圖

/register/
class RegisterView(View):
    def get(self,request):
        return HttpResponse('返回注冊頁面')
    def post(self,request):
        return HttpResponse('進(jìn)行注冊處理...')
    def put(self,request):
        return HttpResponse('put方法被調(diào)用')

2)進(jìn)行url配置

url(r'^register/$',views.RegisterView.as_view())

1.9.2類視圖添加裝飾器

使用Django框架提供method_decorator將針對函數(shù)視圖裝飾器添加到類視圖的方法上面

# 為全部請求方法添加裝飾器
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')

    def post(self, request):
        print('post方法')
        return HttpResponse('ok')


# 為特定請求方法添加裝飾器
@method_decorator(my_decorator, name='get')
class DemoView(View):
    def get(self, request):
        print('get方法')
        return HttpResponse('ok')

    def post(self, request):
        print('post方法')
        return HttpResponse('ok')

1.10中間件

1.10.1定義中間件

def simple_middleware(get_response):
    # 此處編寫的代碼僅在Django第一次配置和初始化的時候執(zhí)行一次刀诬。

    def middleware(request):
        # 此處編寫的代碼會在每個請求處理視圖前被調(diào)用陕壹。

        response = get_response(request)

        # 此處編寫的代碼會在每個請求處理視圖之后被調(diào)用糠馆。

        return response

    return middleware

1.10.2 在MIDDLEWARE中注冊中間

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'users.middleware.my_middleware',  # 添加中間件
]

1.10.3注意:中間件是全局的

1.11使用模板的詳細(xì)步驟

1.加載模板:指定使用模板文件又碌,獲取模板對象

from django.template import loader
temp = loader.get_template('模板文件名')

2.模板渲染:給模板文件傳遞變量,將模板文件中的變量進(jìn)行替換期揪,獲取替換之后的html內(nèi)容

res_html = temp.render(字典)

3.創(chuàng)建響應(yīng)對象

return HttpResponse(res_html)

1.12數(shù)據(jù)庫

1.12.1數(shù)據(jù)庫鏈接配置

1.在settings.py進(jìn)行配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 數(shù)據(jù)庫主機(jī)
        'PORT': 3306,  # 數(shù)據(jù)庫端口
        'USER': 'root',  # 數(shù)據(jù)庫用戶名
        'PASSWORD': 'mysql',  # 數(shù)據(jù)庫用戶密碼
        'NAME': 'django_demo'  # 數(shù)據(jù)庫名字
    }
}

2.首次啟動時需要在項目同名的目錄init.py添加

pip install pymysql
import pymysql
pymysql.install_as_MySQLdb

1.12.2定義模型類

class 模型類名(models.Model):
    # 字段名 = models.字段類型(選項參數(shù))
    # ...
    
    class Meta:
        db_table = '<表名>'

定義外鍵屬性

  hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書')  # 外鍵

cascade是級聯(lián)姓建,刪除主表數(shù)據(jù)時連同外鍵表中數(shù)據(jù)一起刪除

1.12.3遷移生成表

1)生成遷移文件

python manage.py makemigrations

2)同步到數(shù)據(jù)庫中

python manage.py migrate

1.12.4通過模型類和對象進(jìn)行數(shù)據(jù)庫操作(增刪改查)

新增

  1. 創(chuàng)建模型類對象-->對象.save()

注意:添加HeroInfo時,可以給hbook賦值涣狗,也可以直接表中hbook_id賦值

HeroInfo是定義的英雄模型類镀钓,與圖書BookInfo對應(yīng)。

  1. 模型類.objects.create(...)

修改

1. 查詢對象->修改對象屬性->對象.save()
2. 模型類.objects.filter(...).update(...)

刪除

  1. 查詢對象->對象.delete()
  2. 模型類.objects.filter(...).delete()

查詢

基本查詢
    模型類.objects.查詢函數(shù)
條件查詢
    對應(yīng)get, filter, exclude參數(shù)中可以寫查詢條件
    格式: 屬性名__條件名=值
    注意:可以寫多個查詢條件,默認(rèn)是且的關(guān)系
F對象
    用于查詢時字段之間的比較
    from django.db.models import F
Q對象
    用于查詢時條件之間的邏輯關(guān)系
    from django.db.models import Q
    &(與) |(或) ~(非)
聚合
    聚合類: from django.db.models import Count, Sum, Avg, Max, Min
aggregate
排序
    排序默認(rèn)是升序涯穷,降序在排序字段前加-
    order_by
關(guān)聯(lián)查詢
    1. 查詢和指定對象關(guān)聯(lián)的數(shù)據(jù)
    由1查多
        一對象.多類名小寫_set.all()
        例:book.heroinfo_set.all()
    由多查1
        多對象.外鍵屬性
        例:hero.hbook
    2. 通過模型類進(jìn)行關(guān)聯(lián)查詢
    查圖書(一)
        一類.objects.get|filter(多類名__字段__條件=值)
        例:books = BookInfo.objects.filter(heroinfo__hcomment__contains='八')
    查英雄(多)
        多類.objects.filter(外鍵屬性__字段__條件=值)
        例:heros = HeroInfo.objects.filter(hbook__bread__gt=30)

1.13admin站點

上傳圖片
Django自帶文件存儲系統(tǒng),可以直接通過Admin站點進(jìn)行圖片的上傳蝠嘉,默認(rèn)上傳的文件保存在服務(wù)器本地。
使用

1)在配置文件中設(shè)置配置項MEDIA_ROOT='上傳文件的保存目錄'

2)定義模型類時服爷,圖片字段的類型使用ImageField

3)遷移生成表并在admin.py注冊模型類,直接登錄Admin站點就可以進(jìn)行圖片上傳

2.DRF框架

2.1目的

利用DRF框架快速的實現(xiàn)RestAPI接口的設(shè)計

2.2RestfulAPI接口設(shè)計風(fēng)格

關(guān)鍵點
1)url地址盡量使用名詞笼踩,不要使用動詞
2)請求url地址采用不同的請求方式執(zhí)行不同的操作
GET(獲取)
POST(新增)
PUT(修改)
DELETE(刪除)
3)過濾參數(shù)可以放在查詢字符串中
4)響應(yīng)數(shù)據(jù)返回&響應(yīng)狀態(tài)碼

狀態(tài)碼 說明
200 獲取或修改成功
201 新增成功
204 刪除成功
404 資源不存在
400 客戶請求有誤
500 服務(wù)器錯誤

5)響應(yīng)數(shù)據(jù)的格式:json

2.3django自定義RestAPI接口

RestAPI接口核心工作
1.將數(shù)據(jù)庫數(shù)據(jù)序列化為前端所需要的格式掘而,并返回
2.將前端發(fā)送的數(shù)據(jù)反序列化為模型類對象袍睡,并保存到數(shù)據(jù)庫中

2.4DRF框架

2.4.1作用:大大提高RestAPI接口開發(fā)效率

2.5序列化器Serializer

2.5.1功能

進(jìn)行數(shù)據(jù)的序列化和反序列化

2.5.2序列化器的定義

繼承自serializers.Serializer

from rest_framework import serializers

# serializers.Serializer:DRF框架中所有序列化器的父類,定義序列化器類時止潘,可以直接繼承此類
# serializers.ModelSerializer:Serializer類的子類,在父類的基礎(chǔ)山簇宽,添加一些功能

class 序列化器類名(serializers.Serializer):
    # 字段名 = serializers.字段名(選項參數(shù))

序列化器對象創(chuàng)建:

序列化器類(instance=<實例對象>,data=<數(shù)據(jù)>,**kwargs)

2.5.3序列化功能

說白了就是將實例對象轉(zhuǎn)換為字典數(shù)據(jù)

1)序列化單個對象

book = BookInfo.objects.get(id=1)
serializer = BookInfoSerializer(book)
res = json.dumps(serializer.data,ensure_ascii=False,indent=4)

2)序列化多個對象,其實就是添加了一個many參數(shù)

books = BookInfo.objects.all()
serializer = BookInfoSerializer(books,many=True)
res = json.dumps(serializer.data,ensure_ascii=False,indent=4)

3)關(guān)聯(lián)對象的嵌套序列化

1.將關(guān)聯(lián)對象序列化為關(guān)聯(lián)對象的主鍵

hbook = serializers.PrimaryKeyRelatedField(label='圖書'钞它,read_only=True)

2.采用指定的序列化器將關(guān)聯(lián)對象進(jìn)行序列化

hbook = BookInfoSerializer(label='圖書')    

3.將關(guān)聯(lián)對象序列化為關(guān)聯(lián)對象模型類_str_方法的返回值

hbook = serializers.StringRelatedField(label='圖書')

注意:和對象關(guān)聯(lián)的對象如果有多個,在序列化器中定義嵌套序列化字段時锯仪,需要添加many=True。

2.5.4反序列化功能

反序列化-數(shù)據(jù)校驗

data = {'btitle':'python','bpub_date':'1980-1-1'}
serializer = BookInfoSerializer(data)
serializer.is_valid()
serializer.errors
serialiser.validated_data

當(dāng)系統(tǒng)提供的校驗不能滿足我們的需求的時候久窟,我們可以補(bǔ)充額外的驗證:

1)指定特定字段的validators參數(shù)進(jìn)行補(bǔ)充驗證

btitle = serializers.CharField(label='標(biāo)題',max_length=20,validators=[about_django])

注意:此處的about_django為我們自定義的校驗函數(shù)

2)在序列化器類中定義特定方法validate_<fieldname>針對特定字段進(jìn)行補(bǔ)充驗證

def validate_btitle(self,value):
    if 'django' not in value.lower():
        raise serializers.validationError('圖書不是關(guān)于Django的')
    return value

3)定義validate方法進(jìn)行補(bǔ)充驗證(結(jié)合多個字段內(nèi)容驗證)

def validate(self,attrs):
    """
    此處的attrs是一個字典,創(chuàng)建序列化器對象時稀颁,傳入data數(shù)據(jù)
    """
    bread = attrs['bread']
    bcomment = attrs['bcomment']
    if bread<=bcomment:
        raise serializers.ValidationError('圖書閱讀量必須大于評論量')
    return attrs

2.5.5反序列化-數(shù)據(jù)保存(新增&更新)

校驗通過之后麸折,可以調(diào)用serializer.save()進(jìn)行數(shù)據(jù)保存

1)數(shù)據(jù)新增

def create(self,validated_data):
    """
    validated_data:字典垢啼,校驗之后的數(shù)據(jù)
    """
    book = BookInfo.objects.create(**validated_data)
    return book

------------------------------------
data = {'btitle':'python','bpub_data':'1802-1-1','bread':30,'bcomment:20'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()
serializer.save()
serializer.data

2)數(shù)據(jù)更新

def update(self,instance,validated_data):
    """
    instance:創(chuàng)建序列化器對象時傳入實例對象
    validated_data:是一個字典,校驗之后的數(shù)據(jù)
    """
    btitle = validated_data.get('btitle')
    bpub_data_date = validated_data.get('bpub_date')
    
    instance.btitle = btitle
    instance.bpub_date = bpub_date
    instance.save()
    
    return instance

2.5.6使用序列化器改寫RestAPI接口

我們舉兩個代表性的例子即可:

# /books/
class BookListView(View):
    def get(self, request):
        """
        獲取所有的圖書的信息:
        1. 查詢所有的圖書的數(shù)據(jù)
        2. 返回所有圖書的json的數(shù)據(jù)
        """
        # 1. 查詢所有的圖書的數(shù)據(jù)
        books = BookInfo.objects.all() # QuerySet

        # 2. 返回所有圖書的json的數(shù)據(jù),狀態(tài)碼: 200
        books_li = []
        for book in books:
            # 將book對象轉(zhuǎn)換成dict
            book_dict = {
                'id': book.id,
                'btitle': book.btitle,
                'bpub_date': book.bpub_date,
                'bread': book.bread,
                'bcomment': book.bcomment,
                'image': book.image.url if book.image else ''
            }

            books_li.append(book_dict)

        return JsonResponse(books_li, safe=False)

    def post(self, request):
        """
        新增一本圖書的信息:
        1. 獲取參數(shù)btitle和bpub_date并進(jìn)行校驗
        2. 創(chuàng)建圖書信息并添加進(jìn)數(shù)據(jù)表中
        3. 返回新增的圖書的json數(shù)據(jù),狀態(tài)碼: 201
        """
        # 需求: 前端需要傳遞新增圖書的信息(btitle, bpub_date)霉颠,通過json傳遞

        # 1. 獲取參數(shù)btitle和bpub_date并進(jìn)行校驗
        # 獲取json的原始數(shù)據(jù)
        req_data = request.body # bytes

        # 將bytes轉(zhuǎn)換為str
        json_str = req_data.decode()

        # 將json字符串轉(zhuǎn)換dict
        req_dict = json.loads(json_str)

        # 獲取btitle和bpub_date
        btitle = req_dict.get('btitle')
        bpub_date = req_dict.get('bpub_date')

        # TODO: 省略參數(shù)校驗過程...

        # 2. 創(chuàng)建圖書信息并添加進(jìn)數(shù)據(jù)表中
        book = BookInfo.objects.create(
            btitle=btitle,
            bpub_date=bpub_date
        )

        # 3. 返回新增的圖書的json數(shù)據(jù),狀態(tài)碼: 201
        # 將book對象轉(zhuǎn)換成dict
        book_dict = {
            'id': book.id,
            'btitle': book.btitle,
            'bpub_date': book.bpub_date,
            'bread': book.bread,
            'bcomment': book.bcomment,
            'image': book.image.url if book.image else ''
        }

        return JsonResponse(book_dict, status=201)

修改之后:

class BookListView(View):
    def get(self, request):
        books = BookInfo.objects.all() # QuerySet
        serializer = BookInfoSerializer(books, many=True)
        return JsonResponse(serializer.data, safe=False)

    def post(self, request):
        req_data = request.body # bytes
        json_str = req_data.decode()
        req_dict = json.loads(json_str)
        
        serializer = BookInfoSerializer(data=req_dict)
        serializer.is_valid(raise_exception=True)

        # 反序列化-數(shù)據(jù)保存(新增) -> create
        serializer.save()
        return JsonResponse(serializer.data, status=201)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菜枷,一起剝皮案震驚了整個濱河市犁跪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫耳,老刑警劉巖迁杨,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捷沸,死亡現(xiàn)場離奇詭異,居然都是意外死亡苍柏,警方通過查閱死者的電腦和手機(jī)试吁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來治唤,“玉大人,你說我怎么就攤上這事缕陕】敢兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桐罕。 經(jīng)常有香客問我功炮,道長薪伏,這世上最難降的妖魔是什么博秫? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮即寒,結(jié)果婚禮上母赵,老公的妹妹穿的比我還像新娘凹嘲。我一直安慰自己周蹭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宛畦,像睡著了一般次和。 火紅的嫁衣襯著肌膚如雪斯够。 梳的紋絲不亂的頭發(fā)上读规,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼怕敬。 笑死东跪,一個胖子當(dāng)著我的面吹牛虽填,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恶守,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼押框!你這毒婦竟也來了橡伞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挂脑,失蹤者是張志新(化名)和其女友劉穎肋联,沒想到半個月后橄仍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侮繁,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡第晰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年罗岖,在試婚紗的時候發(fā)現(xiàn)自己被綠了桑包。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哑了。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拆火,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情模狭,我是刑警寧澤嚼鹉,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布匹舞,位于F島的核電站晶疼,受9級特大地震影響翠霍,放射性物質(zhì)發(fā)生泄漏寒匙。R本人自食惡果不足惜考蕾,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞帐。 院中可真熱鬧,春花似錦榔幸、人聲如沸牡辽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熟史。三九已至碘菜,卻和暖如春忍啸,著一層夾襖步出監(jiān)牢的瞬間计雌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工玫霎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凿滤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓庶近,卻偏偏與公主長得像翁脆,于是被迫代替她去往敵國和親鼻种。 傳聞我的和親對象是個殘疾皇子反番,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 基于類的視圖 Django中的視圖是一個可調(diào)用對象,它接收一個請求然后返回一個響應(yīng)普舆。這個可調(diào)用對象不僅僅限于函數(shù)恬口,...
    蘭山小亭閱讀 4,579評論 1 13
  • 模塊間聯(lián)系越多,其耦合性越強(qiáng)沼侣,同時表明其獨立性越差( 降低耦合性祖能,可以提高其獨立性)。軟件設(shè)計中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,072評論 0 8
  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 3,867評論 1 22
  • 利用HTTP協(xié)議向服務(wù)器傳參的幾種途徑蛾洛、響應(yīng)养铸、Cookie、Session轧膘、類視圖钞螟、中間件 注意: 1>Dja...
    Cestine閱讀 1,262評論 0 2
  • 一、Django框架前言知識: 1谎碍、C/S和B/S的區(qū)別: C/S結(jié)構(gòu)軟件:客戶端/服務(wù)端軟件鳞滨,即客戶端要自己下載...
    月下獨酌123閱讀 4,550評論 0 36