11-Django框架

MVC
MVC.png
MVT

M:Model旬蟋,模型油昂,和MVC中M功能相同,和數(shù)據(jù)庫進(jìn)行交互
V:View倾贰,視圖冕碟,和MVC中C功能相同,接收請求匆浙,進(jìn)行處理安寺,與M以及T進(jìn)行交互,返回應(yīng)答
T:Template首尼,模板我衬,和MVC中V功能相同,產(chǎn)生html頁面

MVT.png
虛擬環(huán)境
image.png

之前安裝python包的命令: sudo pip3 install 包名
包的安裝路徑:/usr/local/lib/python3.5/dist-packages
在同一個python環(huán)境中安裝同一個包的不同版本饰恕,后安裝的包會把原來安裝的包覆蓋掉挠羔。這樣,如果同一臺機(jī)器上兩個項(xiàng)目依賴于相同包的不同版本埋嵌,則會導(dǎo)致一些項(xiàng)目運(yùn)行失敗破加。
解決的方案就是:虛擬環(huán)境。
虛擬環(huán)境是真實(shí)python環(huán)境的復(fù)制版本雹嗦。
在虛擬環(huán)境中使用的python是復(fù)制的python,安裝python包也是安裝在復(fù)制的python中范舀。

安裝配置
安裝虛擬環(huán)境的命令:

  1. sudo pip install virtualenv #安裝虛擬環(huán)境
  2. sudo pip install virtualenvwrapper #安裝虛擬環(huán)境擴(kuò)展包
  3. 編輯家目錄下面的.bashrc文件,添加下面兩行了罪。
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
  4. 使用source .bashrc使其生效一下锭环。

使用
創(chuàng)建虛擬環(huán)境命令:
mkvirtualenv 虛擬環(huán)境名

創(chuàng)建python3虛擬環(huán)境:
mkvirtualenv -p python3 bj11_py3

進(jìn)入虛擬環(huán)境工作:
workon 虛擬環(huán)境名
查看機(jī)器上有多少個虛擬環(huán)境:
workon 空格 + 兩個tab鍵

退出虛擬環(huán)境:
deactivate

刪除虛擬環(huán)境:
rmvirtualenv 虛擬環(huán)境名

虛擬環(huán)境下安裝包的命令:
pip install 包名
注意:不能使用sudo pip install 包名,這個命令會把包安裝到真實(shí)的主機(jī)環(huán)境上而不是安裝到虛擬環(huán)境中泊藕。
查看虛擬環(huán)境中安裝了哪些python包:
pip list
pip freeze
安裝django環(huán)境:
pip install django==1.8.2
拓展:
apt-get install 軟件
pip install python包名

項(xiàng)目創(chuàng)建
  1. 創(chuàng)建項(xiàng)目
    命令:django-admin startproject 項(xiàng)目名
    注意:創(chuàng)建應(yīng)用必須先進(jìn)入虛擬環(huán)境辅辩。
  2. 創(chuàng)建應(yīng)用
    一個項(xiàng)目由很多個應(yīng)用組成的,每一個應(yīng)用完成一個特定的功能娃圆。
    創(chuàng)建應(yīng)用的命令如下:
    python manage.py startapp 應(yīng)用名
    注意:創(chuàng)建應(yīng)用時需要先進(jìn)入項(xiàng)目目錄玫锋。
  3. 建立應(yīng)用和項(xiàng)目之間的聯(lián)系,需要對應(yīng)用進(jìn)行注冊讼呢。
    修改settings.py中的INSTALLED_APPS配置項(xiàng)撩鹿。


    注冊應(yīng)用.png

    4、運(yùn)行開發(fā)web服務(wù)器命令:
    python manage.py runserver

ORM

django中內(nèi)嵌了ORM框架悦屏,ORM框架可以將類和數(shù)據(jù)表進(jìn)行對應(yīng)起來节沦,只需要通過類和對象就可以對數(shù)據(jù)表進(jìn)行操作键思。
設(shè)計(jì)類:模型類。
ORM另外一個作用:根據(jù)設(shè)計(jì)的類生成數(shù)據(jù)庫中的表甫贯。

模型類

模型類設(shè)計(jì)
在應(yīng)用models.py中設(shè)計(jì)模型類吼鳞。
必須繼承與models.Model類。
1.設(shè)計(jì)BookInfo類获搏。
2.設(shè)計(jì)HeroInfo類赖条。
Models.ForeignKey可以建立兩個模型類之間一對多的關(guān)系,django在生成表的時候常熙,就會在多的表中創(chuàng)建一列作為外鍵纬乍,建立兩個表之間一對多的關(guān)系。

模型類生成表

  1. 生成遷移文件
    命令:python manage.py makemigrations
    遷移文件是根據(jù)模型類生成的裸卫。
  2. 執(zhí)行遷移生成表
    命令:python mange.py migrate
    根據(jù)遷移文件生成表仿贬。
    生成表名的默認(rèn)格式:應(yīng)用名_模型類名小寫

通過模型類操作數(shù)據(jù)表
進(jìn)入項(xiàng)目shell的命令:python manage.py shell

以下為在項(xiàng)目shell終端中演示的例子:
首先導(dǎo)入模型類:
from booktest.models import BookInfo,HeroInfo

  1. 向booktest_bookinfo表中插入一條數(shù)據(jù)。
    b = BookInfo() #定義一個BookInfo類的對象
    b.btitle ='天龍八部' #定義b對象的屬性并賦值
    b.bpub_date = date(1990,10,11)
    b.save() #才會將數(shù)據(jù)保存進(jìn)數(shù)據(jù)庫
  2. 查詢出booktest_bookinfo表中id為1的數(shù)據(jù)墓贿。
    b = BookInfo.objects.get(id=1)
  3. 在上一步的基礎(chǔ)上改變b對應(yīng)圖書的出版日期茧泪。
    b.bpub_date = date(1989,10,21)
    b.save() #才會更新表格中的數(shù)據(jù)
  4. 緊接上一步,刪除b對應(yīng)的圖書的數(shù)據(jù)聋袋。
    b.delete() #才會刪除
  5. 向booktest_heroInfo表中插入一條數(shù)據(jù)队伟。
    h = HeroInfo()
    h.hname = '郭靖' h.hgender = False
    h.hcomment = ‘降龍十八掌’
    b2 = BookInfo.objects.get(id=2)
    h.hbook = b2 #給關(guān)系屬性賦值,英雄對象所屬的圖書對象
    h.save()
  6. 查詢圖書表里面的所有內(nèi)容幽勒。
    BookInfo.objects.all()
    HeroInfo.objects.all()
后臺管理
  1. 本地化
    語言和時區(qū)的本地化嗜侮。
    修改settings.py文件。
  2. 創(chuàng)建管理員
    命令:python manage.py createsuperuser
  3. 注冊模型類
    在應(yīng)用下的admin.py中注冊模型類啥容。
    告訴djang框架根據(jù)注冊的模型類來生成對應(yīng)表管理頁面锈颗。
    b = BookInfo()
    str(b) str
  4. 自定義管理頁面
    自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內(nèi)容咪惠。
視圖函數(shù)的使用
  1. 定義視圖函數(shù)
    視圖函數(shù)定義在views.py中击吱。例:
    def index(request):
    #進(jìn)行處理。遥昧。覆醇。
    return HttpResponse('hello python')

視圖函數(shù)必須有一個參數(shù)request,進(jìn)行處理之后渠鸽,需要返回一個HttpResponse的類對象叫乌,hello python就是返回給瀏覽器顯示的內(nèi)容。

  1. 進(jìn)行url配置


    url配置.png

url配置的目的是讓建立url和視圖函數(shù)的對應(yīng)關(guān)系徽缚。url配置項(xiàng)定義在urlpatterns的列表中,每一個配置項(xiàng)都調(diào)用url函數(shù)革屠。

url函數(shù)有兩個參數(shù)凿试,第一個參數(shù)是一個正則表達(dá)式排宰,第二個是對應(yīng)的處理動作。

配置url時那婉,有兩種語法格式:

  • url(正則表達(dá)式板甘,視圖函數(shù)名)
  • url(正則表達(dá)式,include(應(yīng)用中的urls文件))
    工作中在配置url時详炬,首先在項(xiàng)目的urls.py文件中添加配置項(xiàng)時盐类,并不寫具體的url和視圖函數(shù)之間的對應(yīng)關(guān)系,而是包含具體應(yīng)用的urls.py文件呛谜,在應(yīng)用的urls.py文件中寫url和視圖函數(shù)的對應(yīng)關(guān)系在跳。

url匹配的過程
在項(xiàng)目的urls.py文件中包含具體應(yīng)用的urls.py文件,應(yīng)用的urls.py文件中寫url和視圖函數(shù)的對應(yīng)關(guān)系隐岛。

url匹配過程.png

當(dāng)用戶輸入如http://127.0.0.1:8000/aindex時猫妙,去除域名和最前面的/,剩下aindex聚凹,拿aindex字符串到項(xiàng)目的urls文件中進(jìn)行匹配割坠,配置成功之后,去除匹配的a字符妒牙,那剩下的index字符串繼續(xù)到項(xiàng)目的urls文件中進(jìn)行正則匹配彼哼,匹配成功之后執(zhí)行視圖函數(shù)index,index視圖函數(shù)返回內(nèi)容hello python給瀏覽器來顯示湘今。

模板

模板不僅僅是一個html文件敢朱。

模板文件的使用

  1. 創(chuàng)建模板文件夾
  2. 配置模板目錄


    模板配置.png

使用模板文件

  • 加載模板文件
    去模板目錄下面獲取html文件的內(nèi)容,得到一個模板對象象浑。
  • 定義模板上下文
    向模板文件傳遞數(shù)據(jù)蔫饰。
  • 模板渲染
    得到一個標(biāo)準(zhǔn)的html內(nèi)容。

給模板文件傳遞數(shù)據(jù)
模板變量使用:{{ 模板變量名 }}
模板代碼段:{%代碼段%}
for循環(huán):
{% for i in list %}
{% endfor %}

django數(shù)據(jù)庫配置

修改settings.py中的DATABASES愉豺。


setting配置.png

注意:django框架不會自動幫我們生成mysql數(shù)據(jù)庫篓吁,所以我們需要自己去創(chuàng)建。

切換mysql數(shù)據(jù)庫之后不能啟動服務(wù)器

需要安裝操作mysql數(shù)據(jù)庫的包蚪拦,python2環(huán)境和python3環(huán)境有以下區(qū)別杖剪。

  • a) python2需要安裝mysql-python:
    pip install mysql-python
  • b) python3需要安裝pymysql:
    pip install pymysql

python3中安裝好pymysql,需要在test2/init.py中加如下內(nèi)容:
import pymysql
pymysql.install_as_MySQLdb()

字段屬性和選項(xiàng)

1. 模型屬性命名限制

  • 不能是python的保留關(guān)鍵字驰贷。
  • 不允許使用連續(xù)的下劃線盛嘿,這是由django的查詢方式?jīng)Q定的。
  • 定義屬性時需要指定字段類型括袒,通過字段類型的參數(shù)指定選項(xiàng)次兆,語法如下:
    屬性名=models.字段類型(選項(xiàng))

2. 字段類型
使用時需要引入django.db.models包,字段類型如下:

類型 描述
AutoField 自動增長的IntegerField锹锰,通常不用指定芥炭,不指定時Django會自動創(chuàng)建屬性名為id的自動增長屬性漓库。
BooleanField 布爾字段,值為True或False园蝠。
NullBooleanField 支持Null渺蒿、True、False三種值
CharField(max_length=最大長度) 字符串彪薛。參數(shù)max_length表示最大字符個數(shù)
TextField 大文本字段茂装,一般超過4000個字符時使用
IntegerField 整數(shù)
DecimalField(max_digits=None, decimal_places=None) 十進(jìn)制浮點(diǎn)數(shù)。參數(shù)max_digits表示總位善延。參數(shù)decimal_places表示小數(shù)位數(shù)
FloatField 浮點(diǎn)數(shù)少态。參數(shù)同上
DateField:([auto_now=False, auto_now_add=False]) 日期。1)參數(shù)auto_now表示每次保存對象時挚冤,自動設(shè)置該字段為當(dāng)前時間况增,用于"最后一次修改"的時間戳,它總是使用當(dāng)前日期训挡,默認(rèn)為false澳骤。2) 參數(shù)auto_now_add表示當(dāng)對象第一次被創(chuàng)建時自動設(shè)置當(dāng)前時間,用于創(chuàng)建的時間戳澜薄,它總是使用當(dāng)前日期为肮,默認(rèn)為false。3)參數(shù)auto_now_add和auto_now是相互排斥的肤京,組合將會發(fā)生錯誤颊艳。
TimeField 時間,參數(shù)同DateField
DateTimeField 日期時間忘分,參數(shù)同DateField
FileField 上傳文件字段
ImageField 繼承于FileField棋枕,對上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片

3. 選項(xiàng)
繼承于FileField妒峦,對上傳的內(nèi)容進(jìn)行校驗(yàn)重斑,確保是有效的圖片

選項(xiàng)名 描述
default 默認(rèn)值。設(shè)置默認(rèn)值
primary_key 若為True肯骇,則該字段會成為模型的主鍵字段窥浪,默認(rèn)值是False,一般作為AutoField的選項(xiàng)使用
unique 如果為True, 這個字段在表中必須有唯一值笛丙,默認(rèn)值是False
db_index 若值為True, 則在表中會為此字段創(chuàng)建索引漾脂,默認(rèn)值是False
db_column 字段的名稱,如果未指定胚鸯,則使用屬性的名稱
null 如果為True骨稿,表示允許為空,默認(rèn)值是False
black 如果為True,表示允許為空啊终,默認(rèn)值是False

對比:null是數(shù)據(jù)庫范疇的概念镜豹,blank是后臺管理頁面表單驗(yàn)證范疇的傲须。
經(jīng)驗(yàn):當(dāng)修改模型類之后蓝牲,如果添加的選項(xiàng)不影響表的結(jié)構(gòu),則不需要重新做遷移泰讽,商品的選項(xiàng)中default和blank不影響表結(jié)構(gòu)例衍。
參考文檔:http://python.usyiyi.cn/translate/django_182/index.html

查詢

mysql日志文件
mysql.log是mysql的日志文件,里面記錄的對MySQL數(shù)據(jù)庫的操作記錄已卸。默認(rèn)情況下mysql的日志文件沒有產(chǎn)生佛玄,需要修改mysql的配置文件,步驟如下:

  1. 使用下面的命令打開mysql的配置文件累澡,去除68,69行的注釋梦抢,然后保存。
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
  2. 重啟mysql服務(wù)愧哟,就會產(chǎn)生mysql日志文件奥吩。
    sudo service mysql restart
  3. 打開MySQL的日志文件。
    /var/log/mysql/mysql.log 是mysql日志文件所在的位置蕊梧。
    使用下面的命令可以實(shí)時查看mysql的日志文件:
    sudo tail -f /var/log/mysql/mysql.log
查詢函數(shù)

通過模型類.objects屬性可以調(diào)用如下函數(shù)霞赫,實(shí)現(xiàn)對模型類對應(yīng)的數(shù)據(jù)表的查詢。

函數(shù)名 功能 返回值 說明
get 返回表中滿足條件的一條且只能有一條數(shù)據(jù)肥矢。 返回表中滿足條件的一條且只能有一條數(shù)據(jù) 參數(shù)中寫查詢條件端衰。1. 如果查到多條數(shù)據(jù),則拋異常MultipleObjectsReturned 2. 查詢不到數(shù)據(jù)甘改,則拋異常:DoesNotExist
all 返回模型類對應(yīng)表格中的所有數(shù)據(jù) 返回值是QuerySet類型 查詢集
filter 返回滿足條件的數(shù)據(jù)旅东。 返回值是QuerySet類型 參數(shù)寫查詢條件。
exclude 返回不滿足條件的數(shù)據(jù) 返回值是QuerySet類型 參數(shù)寫查詢條件
order_by 對查詢結(jié)果進(jìn)行排序 返回值是QuerySet類型 參數(shù)中寫根據(jù)哪些字段進(jìn)行排序

get示例:
例:查詢圖書id為3的圖書信息十艾。

all方法示例:
例:查詢圖書所有信息抵代。

filter方法示例:
條件格式:
模型類屬性名__條件名=值

查詢圖書評論量為34的圖書的信息:
a)判等 條件名:exact。
例:查詢編號為1的圖書疟羹。
BookInfo.objects.get(id=1)

b)模糊查詢
例:查詢書名包含'傳'的圖書主守。contains
BookInfo.objects.filter(btitle__contains='傳')
例:查詢書名以'部'結(jié)尾的圖書 endswith 開頭:startswith
BookInfo.objects.filter(btitle__endswith='部')

c)空查詢 isnull
例:查詢書名不為空的圖書。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)范圍查詢 in
例:查詢id為1或3或5的圖書榄融。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比較查詢 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查詢id大于3的圖書参淫。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查詢
例:查詢1980年發(fā)表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
例:查詢1980年1月1日后發(fā)表的圖書愧杯。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))

exclude方法示例:
例:查詢id不為3的圖書信息涎才。
BookInfo.objects.exclude(id=3)

order_by方法示例:
作用:進(jìn)行查詢結(jié)果進(jìn)行排序。
例:查詢所有圖書的信息,按照id從小到大進(jìn)行排序耍铜。
BookInfo.objects.all().order_by('id')
例:查詢所有圖書的信息邑闺,按照id從大到小進(jìn)行排序。
BookInfo.objects.all().order_by('-id')
例:把id大于3的圖書信息按閱讀量從大到小排序顯示棕兼。
BookInfo.objects.filter(id__gt=3).order_by('-bread')

F對象

作用:用于類屬性之間的比較陡舅。
使用之前需要先導(dǎo)入:
from django.db.models import F

例:查詢圖書閱讀量大于評論量圖書信息。
BookInfo.objects.filter(bread__gt=F('bcomment'))
例:查詢圖書閱讀量大于2倍評論量圖書信息伴挚。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q對象

作用:用于查詢時條件之間的邏輯關(guān)系靶衍。not and or,可以對Q對象進(jìn)行&|~操作茎芋。
使用之前需要先導(dǎo)入:
from django.db.models import Q

例:查詢id大于3且閱讀量大于30的圖書的信息颅眶。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查詢id大于3或者閱讀量大于30的圖書的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查詢id不等于3圖書的信息田弥。
BookInfo.objects.filter(~Q(id=3))

聚合函數(shù)

作用:對查詢結(jié)果進(jìn)行聚合操作涛酗。
sum count avg max min
aggregate:調(diào)用這個函數(shù)來使用聚合。 返回值是一個字典
使用前需先導(dǎo)入聚合類:
from django.db.models import Sum,Count,Max,Min,Avg

例:查詢所有圖書的數(shù)目偷厦。
BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}

例:查詢所有圖書閱讀量的總和商叹。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
count函數(shù) 返回值是一個數(shù)字
作用:統(tǒng)計(jì)滿足條件數(shù)據(jù)的數(shù)目。

例:統(tǒng)計(jì)所有圖書的數(shù)目沪哺。
BookInfo.objects.all().count()
BookInfo.objects.count()

例:統(tǒng)計(jì)id大于3的所有圖書的數(shù)目沈自。
BookInfo.objects.filter(id__gt=3).count()


小結(jié).png
查詢集

all, filter, exclude, order_by調(diào)用這些函數(shù)會產(chǎn)生一個查詢集,QuerySet類對象可以繼續(xù)調(diào)用上面的所有函數(shù)辜妓。

查詢集特性

  • 惰性查詢:只有在實(shí)際使用查詢集中的數(shù)據(jù)的時候才會發(fā)生對數(shù)據(jù)庫的真正查詢枯途。
  • 緩存:當(dāng)使用的是同一個查詢集時,第一次使用的時候會發(fā)生實(shí)際數(shù)據(jù)庫的查詢籍滴,然后把結(jié)果緩存起來酪夷,之后再使用這個查詢集時,使用的是緩存中的結(jié)果

限制查詢集
可以對一個查詢集進(jìn)行取下標(biāo)或者切片操作來限制查詢集的結(jié)果孽惰。
對一個查詢集進(jìn)行切片操作會產(chǎn)生一個新的查詢集晚岭,下標(biāo)不允許為負(fù)數(shù)。
取出查詢集第一條數(shù)據(jù)的兩種方式:

方式 說明
b[0] 如果b[0]不存在勋功,會拋出IndexError異常
b[0:1].get() 如果b[0:1].get()不存在坦报,會拋出DoesNotExist異常

exists:判斷一個查詢集中是否有數(shù)據(jù)。True False

模型類查詢
  1. 一對多關(guān)系
    例:圖書類-英雄類
    models.ForeignKey() 定義在多的類中狂鞋。
  2. 多對多關(guān)系
    例:新聞類-新聞類型類 體育新聞 國際新聞
    models.ManyToManyField() 定義在哪個類中都可以片择。
  3. 一對一關(guān)系
    例:員工基本信息類-員工詳細(xì)信息類. 員工工號
    models.OneToOneField定義在哪個類中都可以。
關(guān)聯(lián)查詢(一對多)

1. 查詢和對象關(guān)聯(lián)的數(shù)據(jù)
在一對多關(guān)系中骚揍,一對應(yīng)的類我們把它叫做一類字管,多對應(yīng)的那個類我們把它叫做多類啰挪,我們把多類中定義的建立關(guān)聯(lián)的類屬性叫做關(guān)聯(lián)屬性。
例:查詢id為1的圖書關(guān)聯(lián)的英雄的信息嘲叔。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通過模型類查詢:
HeroInfo.objects.filter(hbook__id=1)
例:查詢id為1的英雄關(guān)聯(lián)的圖書信息亡呵。
h = HeroInfo.objects.get(id=1)
h.hbook
通過模型類查詢:
BookInfo.objects.filter(heroinfo__id=1)
格式:

關(guān)聯(lián)查詢.png

由一類的對象查詢多類的時候:
一類的對象.多類名小寫_set.all() #查詢所用數(shù)據(jù)

由多類的對象查詢一類的時候:
多類的對象.關(guān)聯(lián)屬性 #查詢多類的對象對應(yīng)的一類的對象

由多類的對象查詢一類對象的id時候:
多類的對象. 關(guān)聯(lián)屬性_id
2. 通過模型類實(shí)現(xiàn)關(guān)聯(lián)查詢

image.png

例:查詢圖書信息,要求圖書關(guān)聯(lián)的英雄的描述包含'八'硫戈。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查詢圖書信息锰什,要求圖書中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)

例:查詢書名為“天龍八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龍八部')

通過多類的條件查詢一類的數(shù)據(jù):
一類名.objects.filter(多類名小寫多類屬性名條件名)

通過一類的條件查詢多類的數(shù)據(jù):
多類名.objects.filter(關(guān)聯(lián)屬性一類屬性名條件名)

插入掏愁、刪除和更新

調(diào)用一個模型類對象的save方法的時候就可以實(shí)現(xiàn)對模型類對應(yīng)數(shù)據(jù)表的插入和更新养涮。
調(diào)用一個模型類對象的delete方法的時候就可以實(shí)現(xiàn)對模型類對應(yīng)數(shù)據(jù)表數(shù)據(jù)的刪除蛔趴。

自關(guān)聯(lián)
自關(guān)聯(lián).png

自關(guān)聯(lián)是一種特殊的一對多的關(guān)系鲁纠。
案例:顯示廣州市的上級地區(qū)和下級地區(qū)歌逢。
地區(qū)表:id, atitle, aParent_id;
mysql終端中批量執(zhí)行sql語句:source areas.sql;

管理器

BookInfo.objects.all()->objects是一個什么東西呢搁凸?
答:objects是Django幫我自動生成的管理器對象轴捎,通過這個管理器可以實(shí)現(xiàn)對數(shù)據(jù)的查詢憋他。
objects是models.Manger類的一個對象进陡。自定義管理器之后Django不再幫我們生成默認(rèn)的objects管理器释牺。

  1. 自定義一個管理器類萝衩,這個類繼承models.Manger類。
  2. 再在具體的模型類里定義一個自定義管理器類的對象没咙。

自定義管理器類的應(yīng)用場景:

  1. 改變查詢的結(jié)果集猩谊。
    比如調(diào)用BookInfo.books.all()返回的是沒有刪除的圖書的數(shù)據(jù)。
  2. 添加額外的方法祭刚。
    管理器類中定義一個方法幫我們操作模型類對應(yīng)的數(shù)據(jù)表牌捷。
    使用self.model()就可以創(chuàng)建一個跟自定義管理器對應(yīng)的模型類對象。
    小結(jié):


    管理器.png
元選項(xiàng)

Django默認(rèn)生成的表名:
應(yīng)用名小寫_模型類名小寫涡驮。
元選項(xiàng):
需要在模型類中定義一個元類Meta,在里面定義一個類屬性db_table就可以指定表名暗甥。

視圖

1.視圖的功能
接收請求,進(jìn)行處理捉捅,與M和T進(jìn)行交互撤防,返回應(yīng)答。
返回html內(nèi)容 HttpResponse棒口,也可能重定向 redirect,還可以返回json數(shù)據(jù)寄月。

2.視圖函數(shù)使用

  • 使用
  1. 定義視圖函數(shù)
    request參數(shù)必須有。是一個HttpRequest類型的對象初橘。參數(shù)名可以變化耕蝉,但不要更改扔亥。
  2. 配置url
    建立url和視圖函數(shù)之間的對應(yīng)關(guān)系踢关。
  • url配置的過程
    1.在項(xiàng)目的urls文件中包含具體應(yīng)用的urls文件签舞,在具體應(yīng)用的urls文件中包含具體url和視圖的對應(yīng)關(guān)系。
    2.url配置項(xiàng)是定義在一個名叫urlpatterns的列表中搂鲫,其中的每一個元素就是一個配置項(xiàng)魂仍,每一個配置項(xiàng)都調(diào)用url函數(shù)。

3.url匹配過程

url匹配過程.png

url:http://127.0.0.1:8000/aindex?a=1

  1. 去除域名和后面的參數(shù)闸英,剩下/aindex,再把前面的/去掉出吹,剩下aindex
  2. 拿aindex先到項(xiàng)目的url.py文件中進(jìn)行從上到下的匹配鸠珠,匹配成功之后執(zhí)行后面對應(yīng)的處理動作,就是把匹配成功的部分a字符去除驯耻,然后拿剩下的部分index到應(yīng)用的urls.py文件中再進(jìn)行從上到下的匹配。
  3. 如果匹配成功則調(diào)用相應(yīng)的視圖產(chǎn)生內(nèi)容返回給客戶端可缚。如果匹配失敗則產(chǎn)生404錯誤。
錯誤視圖

404:找不到頁面帘靡,關(guān)閉調(diào)試模式之后,默認(rèn)會顯示一個標(biāo)準(zhǔn)的錯誤頁面测柠,如果要顯示自定義的頁面,則需要的templates目錄下面自定義一個404.html文件缘滥。

  • a) url沒有配置
  • b) url配置錯誤

500: 服務(wù)器端的錯誤谒主。

  • a) 視圖出錯
    網(wǎng)站開發(fā)完成需要關(guān)閉調(diào)試模式霎肯,在settings.py文件中:
    DEBUG=False
    ALLOWED_HOST=[ '*']
捕獲url參數(shù)

進(jìn)行url匹配時,把所需要的捕獲的部分設(shè)置成一個正則表達(dá)式組搪柑,這樣django框架就會自動把匹配成功后相應(yīng)組的內(nèi)容作為參數(shù)傳遞給視圖函數(shù)聋丝。

  1. 位置參數(shù)
    位置參數(shù),參數(shù)名可以隨意指定
  2. 關(guān)鍵字參數(shù):在位置參數(shù)的基礎(chǔ)上給正則表達(dá)式組命名即可工碾。
    ?P<組名>
    關(guān)鍵字參數(shù)弱睦,視圖中參數(shù)名必須和正則表達(dá)式組名一致.
Ajax

基本概念
異步的javascript。在不全部加載某一個頁面部的情況下渊额,對頁面進(jìn)行局的刷新况木,ajax請求都在后臺垒拢。
圖片,css文件火惊,js文件都是靜態(tài)文件求类。

ajax.png

  1. 發(fā)起ajax請求:jquery發(fā)起
  2. 執(zhí)行相應(yīng)的視圖函數(shù),返回json內(nèi)容
  3. 執(zhí)行相應(yīng)的回調(diào)函數(shù)矗晃。通過判斷json內(nèi)容仑嗅,進(jìn)行相應(yīng)處理。
Ajax登錄案例
    1. 首先分析出請求地址時需要攜帶的參數(shù)张症。
    1. 視圖函數(shù)處理完成之后仓技,所返回的json的格式。
    1. 顯示出登錄頁面

在里面寫jquery代碼發(fā)起ajax請求地沮。

    1. 登錄校驗(yàn)功能

接收post提交過來的數(shù)據(jù)摩疑。

進(jìn)行登錄校驗(yàn),并返回json內(nèi)容畏铆。 JsonRepsone

Json格式如下:

{'res':'1'} #表示登錄成功

{'res':'0'} #表示登錄失敗

狀態(tài)保持

http協(xié)議是無狀態(tài)的雷袋。下一次去訪問一個頁面時并不知道上一次對這個頁面做了什么。

  • cookie


    cookie.png

cookie是由服務(wù)器生成辞居,存儲在瀏覽器端的一小段文本信息楷怒。
cookie的特點(diǎn):

  1. 以鍵值對方式進(jìn)行存儲。
  2. 通過瀏覽器訪問一個網(wǎng)站時瓦灶,會將瀏覽器存儲的跟網(wǎng)站相關(guān)的所有cookie信息發(fā)送給該網(wǎng)站的服務(wù)器鸠删。request.COOKIES
  3. cookie是基于域名安全的。www.baidu.com www.tudou.com
  4. cookie是有過期時間的贼陶,如果不指定刃泡,默認(rèn)關(guān)閉瀏覽器之后cookie就會過期。
  • session


    session.png

session存儲在服務(wù)器端每界。
session的特點(diǎn):

  1. session是以鍵值對進(jìn)行存儲的捅僵。
  2. session依賴于cookie。唯一的標(biāo)識碼保存在sessionid cookie中眨层。
  3. session也是有過期時間庙楚,如果不指定,默認(rèn)兩周就會過期
  • cookie和session的應(yīng)用場景
    cookie:記住用戶名趴樱。安全性要求不高馒闷。
    session:涉及到安全性要求比較高的數(shù)據(jù)酪捡。銀行卡賬戶,密碼
模板

1.模板的功能
產(chǎn)生html,控制頁面上展示的內(nèi)容纳账。模板文件不僅僅是一個html文件逛薇。
模板文件包含兩部分內(nèi)容:

  1. 靜態(tài)內(nèi)容:css,js,html。
  2. 動態(tài)內(nèi)容:用于動態(tài)去產(chǎn)生一些網(wǎng)頁內(nèi)容疏虫。通過模板語言來產(chǎn)生永罚。

2.模板文件的使用
通常是在視圖函數(shù)中使用模板產(chǎn)生html內(nèi)容返回給客戶端。

  • a) 加載模板文件 loader.get_template
    獲取模板文件的內(nèi)容卧秘,產(chǎn)生一個模板對象呢袱。
  • b) 定義模板上下文 RequeseContext
    給模板文件傳遞數(shù)據(jù)。
  • c) 模板渲染產(chǎn)生html頁面內(nèi)容 render
    用傳遞的數(shù)據(jù)替換相應(yīng)的變量翅敌,產(chǎn)生一個替換后的標(biāo)準(zhǔn)的html內(nèi)容羞福。

3.模板文件加載順序

image.png

  1. 首先去配置的模板目錄下面去找模板文件。
  2. 去INSTALLED_APPS下面的每個應(yīng)用的templates去找模板文件蚯涮,前提是應(yīng)用中必須有templates文件夾治专。

4.模板語言
模板語言簡稱為DTL。(Django Template Language)

  • 模板變量
    模板變量名是由數(shù)字遭顶,字母张峰,下劃線和點(diǎn)組成的,不能以下劃線開頭棒旗。
    使用模板變量:{{模板變量名}}
    模板變量的解析順序:
    例如:{{ book.btitle }}
  1. 首先把book當(dāng)成一個字典挟炬,把btitle當(dāng)成鍵名,進(jìn)行取值book['btitle']
  2. 把book當(dāng)成一個對象嗦哆,把btitle當(dāng)成屬性,進(jìn)行取值book.btitle
  3. 把book當(dāng)成一個對象婿滓,把btitle當(dāng)成對象的方法老速,進(jìn)行取值book.btitle

例如:{{book.0}}

  1. 首先把book當(dāng)成一個字典,把0當(dāng)成鍵名凸主,進(jìn)行取值book[0]
  2. 把book當(dāng)成一個列表橘券,把0當(dāng)成下標(biāo),進(jìn)行取值book[0]
    如果解析失敗卿吐,則產(chǎn)生內(nèi)容時用空字符串填充模板變量旁舰。
    使用模板變量時,.前面的可能是一個字典嗡官,可能是一個對象箭窜,還可能是一個列表。
  • 模板標(biāo)簽
    {% 代碼段 %}
    for循環(huán):
    {% for x in 列表 %}
    # 列表不為空時執(zhí)行
    {% empty %}
    # 列表為空時執(zhí)行
    {% endfor %}
    可以通過{{ forloop.counter }}得到for循環(huán)遍歷到了第幾次衍腥。
    {% if 條件 %}
    {% elif 條件 %}
    {% else %}
    {% endif %}
    關(guān)系比較操作符:> < >= <= == !=
    注意:進(jìn)行比較操作時磺樱,比較操作符兩邊必須有空格纳猫。
    邏輯運(yùn)算:not and or

  • 過濾器
    過濾器用于對模板變量進(jìn)行操作。
    date:改變?nèi)掌诘娘@示格式竹捉。
    length:求長度芜辕。字符串,列表.
    default:設(shè)置模板變量的默認(rèn)值块差。
    格式:模板變量|過濾器:參數(shù)
    自定義過濾器侵续。
    自定義的過濾器函數(shù),至少有一個參數(shù)憨闰,最多兩個状蜗。

from django.template import Library

register = Library()


@register.filter
def mod(num):
    return num % 2 == 0

@register.filter
def mod_val(num,val):
    return num % val == 0
  • 模板注釋
    單行注釋:{# 注釋內(nèi)容 #}
    多行注釋:
    {% comment %}
    注釋內(nèi)容
    {% endcomment %}
模板繼承

模板繼承也是為了重用html頁面內(nèi)容。


模板繼承.png

在父模板里可以定義塊起趾,使用標(biāo)簽:
{% block 塊名 %}
塊中間可以寫內(nèi)容诗舰,也可以不寫
{% endblock 塊名%}
子模板去繼承父模板之后,可以重寫父模板中的某一塊的內(nèi)容训裆。
繼承格式:{% extends 父模板文件路徑%}
{% block 塊名 %}
{{ block.super}} #獲取父模板中塊的默認(rèn)內(nèi)容
重寫的內(nèi)容
{% endblock 塊名%}

html轉(zhuǎn)義

編輯商品詳情信息眶根,數(shù)據(jù)表中保存的是html內(nèi)容。
在模板上下文中的html標(biāo)記默認(rèn)是會被轉(zhuǎn)義的边琉。
小于號< 轉(zhuǎn)換為<
大于號> 轉(zhuǎn)換為>
單引號' 轉(zhuǎn)換為'
雙引號" 轉(zhuǎn)換為 "
與符號& 轉(zhuǎn)換為 &
要關(guān)閉模板上下文字符串的轉(zhuǎn)義:可以使用 {{ 模板變量|safe}}
也可以使用:
{% autoescape off %}
模板語言代碼
{% endautoescape %}
模板硬編碼中的字符串默認(rèn)不會經(jīng)過轉(zhuǎn)義属百,如果需要轉(zhuǎn)義,那需要手動進(jìn)行轉(zhuǎn)義变姨。

csrf攻擊

首先做一個登錄頁族扰,讓用戶輸入用戶名和密碼進(jìn)行登錄,登錄成功之后跳轉(zhuǎn)的修改密碼頁面定欧。在修改密碼頁面輸入新密碼渔呵,點(diǎn)擊確認(rèn)按鈕完成密碼修改。

登錄頁需要一個模板文件login.html.修改密碼頁面也需要一個模板文件change_pwd.html.
顯示登錄頁的視圖login砍鸠,驗(yàn)證登錄的視圖login_check扩氢,顯示發(fā)帖頁的視圖change_pwd,處理修改密碼的視圖change_pwd_action.

加功能:
a)只有用戶登錄之后才可以進(jìn)行修改密碼操作。
登錄裝飾器函數(shù)爷辱。


裝飾器.png

案例流程圖:


image.png

django防止csrf的方式:

  1. 默認(rèn)打開csrf中間件录豺。
  2. 表單post提交數(shù)據(jù)時加上{% csrf_token %}標(biāo)簽。
    防御原理:
  1. 渲染模板文件時在頁面生成一個名字叫做csrfmiddlewaretoken的隱藏域饭弓。
  2. 服務(wù)器交給瀏覽器保存一個名字為csrftoken的cookie信息双饥。
    提交表單時,兩個值都會發(fā)給服務(wù)器弟断,服務(wù)器進(jìn)行比對咏花,如果一樣,則csrf驗(yàn)證通過夫嗓,否則失敗迟螺。
驗(yàn)證碼

在用戶注冊冲秽、登錄頁面,為了防止暴力請求矩父,可以加入驗(yàn)證碼功能锉桑,如果驗(yàn)證碼錯誤,則不需要繼續(xù)處理窍株,可以減輕業(yè)務(wù)服務(wù)器民轴、數(shù)據(jù)庫服務(wù)器的壓力。

反向解析

當(dāng)某一個url配置的地址發(fā)生變化時球订,頁面上使用反向解析生成地址的位置不需要發(fā)生變化后裸。
根據(jù)url 正則表達(dá)式的配置動態(tài)的生成url。
在項(xiàng)目urls中包含具體應(yīng)用的urls文件時指定namespace;


image.png

在應(yīng)用的urls中配置是指定name;


image.png

在模板文件中使用時冒滩,格式如下:
{% url 'namespace名字:name' %} 例如{% url 'booktest:fan2'%}
帶位置參數(shù):
{% url 'namespace名字:name' 參數(shù) %} 例如{% url 'booktest:fan2' 1%}
帶關(guān)鍵字參數(shù):
{% url 'namespace名字:name' 關(guān)鍵字參數(shù) %} 例如{% url 'booktest:fan2' id=1 %}
在重定向的時候使用反向解析:
from django.core.urlresolvers import reverse
無參數(shù):
reverse('namespace名字:name名字')
如果有位置參數(shù)
reverse('namespace名字:name名字', args = 位置參數(shù)元組)
如果有關(guān)鍵字參數(shù)
reverse('namespace名字:name名字', kwargs=字典)

靜態(tài)文件

使用
在 網(wǎng)頁使用的css文件微驶,js文件和圖片叫做靜態(tài)文件。

  1. 新建靜態(tài)文件夾 static开睡。


    image.png
  2. 配置靜態(tài)文件所在的物理目錄因苹。Settings.py
    STATIC_URL設(shè)置訪問靜態(tài)文件對應(yīng)的url。
    STATICFILES_DIRS設(shè)置靜態(tài)文件所在的物理目錄篇恒。
    動態(tài)生成靜態(tài)文件的路徑扶檐。

加載目錄
STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder'

中間件

中間件函數(shù)是django框架給我們預(yù)留的函數(shù)接口,讓我們可以干預(yù)請求和應(yīng)答的過程胁艰。


中間件.png

獲取瀏覽器端的ip地址
使用request對象的META屬性:request.META['REMOTE_ADDR']

使用中間件

  • 新建middleware.py文件款筑。
image.png
  • 定義中間件類。


    image.png

在類中定義中間件預(yù)留函數(shù)腾么。
__init__:服務(wù)器響應(yīng)第一個請求的時候調(diào)用奈梳。
process_request:是在產(chǎn)生request對象,進(jìn)行url匹配之前調(diào)用解虱。
process_view:是url匹配之后颈嚼,調(diào)用視圖函數(shù)之前。
process_response:視圖函數(shù)調(diào)用之后饭寺,內(nèi)容返回給瀏覽器之前。
process_exception:視圖函數(shù)出現(xiàn)異常叫挟,會調(diào)用這個函數(shù)艰匙。
如果注冊的多個中間件類中包含process_exception函數(shù)的時候,調(diào)用的順序跟注冊的順序是相反的抹恳。

  • 注冊中間件類员凝。


    image.png
Admin后臺管理

使用

  1. 本地化。語言和時區(qū)本地化奋献。
  2. 創(chuàng)建超級管理員健霹。
    python mange.py createsuperuser
  3. 注冊模型類旺上。
  4. 自定義管理頁面。
    自定義模型管理類糖埋。
    注冊模型類的時候給register函數(shù)添加第二個參數(shù)宣吱,就是自定義模型管理類的名字。

模型管理類相關(guān)屬性

  1. 列表頁相關(guān)的選項(xiàng)瞳别。
  2. 編輯頁相關(guān)的選項(xiàng)征候。
上傳圖片

商品銷售網(wǎng)站。

  • 配置上傳文件保存目錄
  1. 新建上傳文件保存目錄祟敛。


    image.png
  • 配置上傳文件保存目錄


    image.png
  • 后臺管理頁面上傳圖片

  1. 設(shè)計(jì)模型類


    image.png
  2. 遷移生成表格


    image.png
  3. 注冊模型類
  • 用戶自定義頁面上傳圖片
  1. 定義用戶上傳圖片的頁面并顯示疤坝,是一個自定義的表單。


    image.png
  2. 定義接收上傳文件的視圖函數(shù)
    request對象有一個FILES的屬性馆铁,類似于字典跑揉,通過request.FILES可以獲取上傳文件的處理對象。
    在django中埠巨,上傳文件不大于2.5M,文件放在內(nèi)存中历谍。上傳文件大于2.5M,文件內(nèi)容寫到一個臨時文件中。
    Django處理上傳文件的兩個類:
    FILE_UPLOAD_HANDLERS= ("django.core.files.uploadhandler.MemoryFileUploadHandler",
    "django.core.files.uploadhandler.TemporaryFileUploadHandler")

分頁

查詢出所有省級地區(qū)的信息乖订,顯示在頁面上扮饶。
AeroInfo.objects.filter(aParent__isnull = True)

  1. 查詢出所有省級地區(qū)的信息。
  2. 按每頁顯示10條信息進(jìn)行分頁乍构,默認(rèn)顯示第一頁的信息甜无,下面并顯示出頁碼。
  3. 點(diǎn)擊i頁鏈接的時候哥遮,就顯示第i頁的省級地區(qū)信息岂丘。
    from django.core.paginator import Paginator
    paginator = Paginator(areas, 10) #按每頁10條數(shù)據(jù)進(jìn)行分頁
    Paginator類對象的屬性:
屬性名 說明
num_pages 返回分頁之后的總頁數(shù)
page_range 返回分頁后頁碼的列表

Pageinator類對象的方法:

方法名 說明
page(self,number) 返回第number頁的page類實(shí)例對象

Page類對象的屬性:

屬性名 說明
number 返回當(dāng)前頁的頁碼
object_list 返回包含當(dāng)前頁的數(shù)據(jù)的查詢集
paginator 返回對應(yīng)的Paginator類對象

Page類對象的方法:

屬性名 說明
has_previous 判斷當(dāng)前頁是否有前一頁
has_next 判斷當(dāng)前頁是否有下一頁
previous_page_number 返回前一頁的頁碼
next_page_number 返回下一頁的頁碼
省市縣選擇案例
  1. 顯示省地區(qū)信息。
    $.get('/prov', function(data){
    })
  2. 省改變時在對應(yīng)的下拉列表框中顯示下級市的信息眠饮。
    $.get('/city?pid='+pid, function(data){
    })
    request.GET.get(‘pid’)
    或者:
    $.get('/city'+$(this).val(), function(data){
    })
  3. 市改變時在對應(yīng)的下拉列表框中顯示下級縣的信息奥帘。
    $.get('/dis?pid='+pid, function(data){
    })
    或者:
    $.get('/dis'+$(this).val(), function(data){
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仪召,隨后出現(xiàn)的幾起案子寨蹋,更是在濱河造成了極大的恐慌,老刑警劉巖扔茅,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已旧,死亡現(xiàn)場離奇詭異,居然都是意外死亡召娜,警方通過查閱死者的電腦和手機(jī)运褪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秸讹,你說我怎么就攤上這事檀咙。” “怎么了璃诀?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵弧可,是天一觀的道長。 經(jīng)常有香客問我文虏,道長侣诺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任氧秘,我火速辦了婚禮年鸳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丸相。我一直安慰自己搔确,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布灭忠。 她就那樣靜靜地躺著膳算,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弛作。 梳的紋絲不亂的頭發(fā)上涕蜂,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音映琳,去河邊找鬼机隙。 笑死,一個胖子當(dāng)著我的面吹牛萨西,可吹牛的內(nèi)容都是我干的有鹿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谎脯,長吁一口氣:“原來是場噩夢啊……” “哼葱跋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起源梭,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娱俺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后废麻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矢否,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年脑溢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡屑彻,死狀恐怖验庙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情社牲,我是刑警寧澤粪薛,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站搏恤,受9級特大地震影響违寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熟空,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一藤巢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧息罗,春花似錦掂咒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挨摸,卻和暖如春孩革,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背得运。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工膝蜈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澈圈。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓彬檀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞬女。 傳聞我的和親對象是個殘疾皇子窍帝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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