1 初識Flask


1.1 搭建開發(fā)環(huán)境


  1. 用pip+virtualenv管理包和虛擬環(huán)境
  2. 這里個人推薦使用conda環(huán)境和包管理工具(MiniConda)
  3. Pipenv
    一個程序通常會使用很多的Python包教硫,即依賴(dependency)格侯。而程序不僅僅會在一臺電腦上運行吮炕,程序部署上線時需要安裝到遠程服務 器上剪勿,而你也許會把它分享給朋友。如果你打算開源的話,就可能會有 更多的人需要在他們的電腦上運行。為了能順利運行程序贸铜,他們不得不記下所有依賴包,然后使用pip聂受、conda或Pipenv安裝蒿秦,這些重復無用的工作當然應該避免。在以前我們通常使用pip搭配一個requirements.txt文件來記錄依賴蛋济。但requirements.txt需要手動維護棍鳖,在使用上不夠靈活。Pipfile的出現(xiàn)就是為了替代難于管理的requirements.txt瘫俊。

安裝flask,這些包管理工具同時也會安裝flask的相關依賴包


1.2.1 創(chuàng)建程序實例


以下app.py腳本中包含一個最小的Flask程序
對于簡單的的程序來說鹊杖,程序的主模塊一般命令為app.py。你也可以 使用其他名稱扛芽,比如hello.py骂蓖,但是要避免使用flask.py,因為這和Flask 本身沖突川尖。

#app.py
from flask import Flask 
app = Flask(__name__)  #創(chuàng)建Flask程序實例
#Flask類是Flask的核心類登下,它提供了很多與程序相關的屬性和方法。

@app.route('/') 
def index():    
       return '<h1>Hello Flask!</h1>'

傳入Flask類構造方法的第一個參數(shù)是模塊或包的名稱叮喳,我們應該使用特殊變量name被芳。Python會根據(jù)所處的模塊來賦予name變量相應的值,對于我們的程序來說(app.py)馍悟,這個值為app畔濒。除此之外,這也會幫助Flask在相應的文件夾里找到需要的資源锣咒,比如模板和靜態(tài)文件侵状。

1.2.2 注冊路由

在一個Web應用里,客戶端和服務器上的Flask程序的交互可以簡單 概括為以下幾步:
1)用戶在瀏覽器輸入URL訪問某個資源毅整。
2)Flask接收用戶請求并分析請求的URL趣兄。
3)為這個URL找到對應的處理函數(shù)。
4)執(zhí)行函數(shù)并生成響應悼嫉,返回給瀏覽器艇潭。
5)瀏覽器接收并解析響應,將信息顯示在頁面中。

上面這些步驟大部分都由Flask完成蹋凝,我們要做的是建立處理請求的函數(shù)鲁纠,并為其定義對應的URL規(guī)則。只需為函數(shù)附加 app.route()裝飾器仙粱,并傳入URL規(guī)則作為參數(shù)房交,我們就可以讓URL與函數(shù)建立關聯(lián)彻舰。這個過程我們稱為注冊路由(route)伐割,路由負責管理 URL和函數(shù)之間的映射,而這個函數(shù)則被稱為視圖函數(shù)(view function)刃唤。

@app.route('/') 
def index():    
    return '<h1>Hello, World!</h1>'

在這個程序里隔心,app.route()裝飾器把根地址/和index()函數(shù)綁定起來,當用戶訪問這個URL時就會觸發(fā)index()函數(shù)尚胞。這個視圖函數(shù)可以像其他普通函數(shù)一樣執(zhí)行任意操作硬霍,比如從數(shù)據(jù)庫中獲取信息, 獲取請求信息笼裳,對用戶輸入的數(shù)據(jù)進行計算和處理等唯卖。最后,視圖函數(shù) 返回的值將作為響應的主體躬柬,一般來說拜轨,響應的主體就是呈現(xiàn)在瀏覽器窗口的HTML頁面。

雖然這個程序相當簡單允青,但它卻是大部分Flask程序的基本模式橄碾。在復雜的程序中,我們會有許多個視圖函數(shù)分別處理不同URL的請求颠锉,在視圖函數(shù)中會完成更多的工作法牲,并且返回包含各種鏈接、表單琼掠、圖片的 HTML文件拒垃,而不僅僅是一行字符串。返回的頁面中的鏈接又會指向其 他URL瓷蛙,被單擊后觸發(fā)對應的視圖函數(shù)悼瓮,獲得不同的返回值,從而顯示 不同的頁面速挑,這就是我們?yōu)g覽網(wǎng)頁時的體驗谤牡。

route()裝飾器的第一個參數(shù)是URL規(guī)則,用字符串表示姥宝,必須以 斜杠(/)開始翅萤。這里的URL是相對URL(又稱為內部URL),即不包含域名的URL

1 為視圖綁定多個URL:
一個視圖函數(shù)可以綁定多個URL,比如下面的代碼把/hi和/hello都 綁定到say_hello()函數(shù)上套么,這就會為say_hello視圖注冊兩個路由培己,用 戶訪問這兩個URL均會觸發(fā)say_hello()函數(shù),獲得相同的響應

@app.route('/hi') 
@app.route('/hello') 
def say_hello():    
    return '<h1>Hello, Flask!</h1>'

**2 動態(tài)URL **

我們不僅可以為視圖函數(shù)綁定多個URL胚泌,還可以在URL規(guī)則中添加變量部分省咨,使用“<變量名>”的形式表示。Flask處理請求時會把變量傳入視圖函數(shù)玷室,所以我們可以添加參數(shù)獲取這個變量值

@app.route('/greet/<name>') 
def greet(name):    
    return '<h1>Hello, %s!</h1>' % name
  《多個參數(shù)怎么操作呢零蓉??穷缤?》

因為URL中可以包含變量敌蜂,所以我們將傳入app.route()的字符串稱為URL規(guī)則而不是URL。Flask會解析請求并把請求的URL與視圖函數(shù)的URL規(guī)則進行匹配津肛。比如章喉,這個greet視圖的URL規(guī)則 為/greet/<name>,那么類似/greet/foo身坐、/greet/bar的請求都會觸發(fā)這個視 圖函數(shù)秸脱。

當URL規(guī)則中包含變量時,如果用戶訪問的URL中沒有添加變量部蛇, 比如/greet摊唇,那么Flask在匹配失敗后會返回一個404錯誤響應。一個很常見的行為是在app.route()裝飾器里使用defaults參數(shù)設置URL變量的默 認值搪花,這個參數(shù)接收字典作為輸入遏片,存儲URL變量和默認值的映射。在下面的代碼中撮竿,我們?yōu)間reet視圖新添加了一個app.route()裝飾器吮便,

  @app.route('/greet', defaults={'name': 'Programmer'}) 
  @app.route('/greet/<name>') 
  def greet(name):    
    return '<h1>Hello, %s!</h1>' % name

這時如果用戶訪問/greet,那么變量name會使用默認值 Programmer幢踏,視圖函數(shù)返回<h1>Hello髓需,Programmer!</h1>房蝉。上面的用 法實際效果等同于:

@app.route('/greet') 
@app.route('/greet/<name>') 
def greet(name='Programmer'):   
    return '<h1>Hello, %s!</h1>' % name

1.3 啟動開發(fā)服務器


Flask內置了一個簡單的開發(fā)服務器(由依賴包Werkzeug提供)僚匆, 足夠在開發(fā)和測試階段使用。在生產環(huán)境需要使用性能夠好的生產服務器搭幻,以提升安全和性能咧擂。

Flask通過依賴包Click內置了一個CLI(Command Line Interface,命 令行交互界面)系統(tǒng)檀蹋。當我們安裝Flask后松申,會自動添加一個flask命令腳本,我們可以通過flask命令執(zhí)行內置命令、擴展提供的命令或是我們自己定義的命令贸桶。其中舅逸,flask run命令用來啟動內置的開發(fā)服務器。啟動時確保執(zhí)行命令前激活了虛擬環(huán)境皇筛。

flask run命令運行的開發(fā)服務器默認會監(jiān)聽http://127.0.0.1:5000/地址(按Crtl+C退出)琉历,并開啟多線程支持。http://localhost::5000/與http://127.0.0.1:5000/除了地址不同外水醋,兩者沒有實際區(qū)別旗笔,即域名和IP地址的映射關系。

舊的啟動開發(fā)服務器的方式是使用app.run()方法离例,目前已不推薦 使用(deprecated)换团。

一般來說,在執(zhí)行flask run命令運行程序前宫蛆,我們需要提供程序實例所在模塊的位置。我們在上面可以直接運行程序的猛,是因為Flask會自動 探測程序實例耀盗,自動探測存在下面這些規(guī)則:
·從當前目錄尋找app.py和wsgi.py模塊,并從中尋找名為app或application的程序實例卦尊。
·從環(huán)境變量FLASK_APP對應的值尋找名為app或application的程序實例叛拷。

因為我們的程序主模塊命名為app.py,所以flask run命令會自動在 其中尋找程序實例岂却。如果你的程序主模塊是其他名稱忿薇,比如hello.py, 那么需要設置環(huán)境變量FLASK_APP躏哩,將包含程序實例的模塊名賦值給這個變量署浩。

#Linux或macOS系統(tǒng)使用export命令
 export FLASK_APP=hello
 
 #在Windows系統(tǒng)中使用set命令:
set FLASK_APP=hello

我們在上面啟動的Web服務器默認是對外不可見的,可以在run命 令后添加--host選項將主機地址設為0.0.0.0使其對外可見:

 flask run --host=0.0.0.0

這會讓服務器監(jiān)聽所有外部請求扫尺。個人計算機(主機)一般沒有公 網(wǎng)IP(公有地址)筋栋,所以你的程序只能被局域網(wǎng)內的其他用戶通過你的 個人計算機的內網(wǎng)IP(私有地址)訪問,比如你的內網(wǎng)IP為 192.168.191.1正驻。當局域網(wǎng)內的其他用戶訪問http://192.168.191.1:5000時弊攘, 也會看到瀏覽器里顯示一行“Hello,F(xiàn)lask姑曙!”襟交。要讓互聯(lián)網(wǎng)上的所有人都可訪問,可以考慮使用ngrok(https://ngrok.com/)Localtunnel(https://localtunnel.github.io/www/)等內網(wǎng)穿透/端口轉發(fā)工 具伤靠。

Flask提供的Web服務器默認監(jiān)聽5000端口捣域,你可以在啟動時傳入?yún)?shù)來改變它:

 flask run --port=8000

執(zhí)行flask run命令時的host和port選項也可以通過環(huán)境變量 FLASK_RUN_HOST和FLASK_RUN_PORT設置。事實上,F(xiàn)lask內置的
命令都可以使用這種模式定義默認選項值竟宋, 即“FLASK_<COMMAND>_<OPTION>”提完,你可以使用flask--help命令查 看所有可用的命令。

** 設置運行環(huán)境**

開發(fā)環(huán)境是指我們在本地編寫和測試程序時的計算機環(huán)境丘侠,而生產環(huán)境與開發(fā)環(huán)境相對徒欣,它指的是網(wǎng)站部署上線供用戶訪問時的服務器環(huán)境。
根據(jù)運行環(huán)境的不同蜗字,F(xiàn)lask程序打肝、擴展以及其他程序會改變相應的行為和設置。為了區(qū)分程序運行環(huán)境挪捕,F(xiàn)lask提供了一個FLASK_ENV環(huán)境變量用來設置環(huán)境粗梭,默認為production(生產)。在開發(fā)時级零,我們可 以將其設為development(開發(fā))断医,這會開啟所有支持開發(fā)的特性

在開發(fā)環(huán)境下,調試模式(Debug Mode)將被開啟奏纪,這時執(zhí)行flask run啟動程序會自動激活Werkzeug內置的調試器(debugger)和重載器 (reloader)鉴嗤,它們會為開發(fā)帶來很大的幫助。如果你想單獨控制調試模式的開關序调,可以通過FLASK_DEBUG環(huán)境 變量設置醉锅,設為1則開啟,設為0則關閉发绢,不過通常不推薦手動設置這個
值硬耍。

在生產環(huán)境中部署程序時,絕不能開啟調試模式边酒。盡管PIN碼可以 避免用戶任意執(zhí)行代碼经柴,提高攻擊者利用調試器的難度,但并不能確保 調試器完全安全甚纲,會帶來巨大的安全隱患口锭。而且攻擊者可能會通過調試 信息獲取你的數(shù)據(jù)庫結構等容易帶來安全問題的信息。另一方面介杆,調試 界面顯示的錯誤信息也會讓普通用戶感到困惑鹃操。

1.調試器
Werkzeug提供的調試器非常強大,當程序出錯時春哨,我們可以在網(wǎng)頁 上看到詳細的錯誤追蹤信息荆隘,這在調試錯誤時非常有用。

2.重載器
當我們對代碼做了修改后赴背,期望的行為是這些改動立刻作用到程序 上椰拒。重載器的作用就是監(jiān)測文件變動晶渠,然后重新啟動開發(fā)服務器。默認會使用Werkzeug內置的stat重載器燃观,它的缺點是耗電較嚴重褒脯, 而且準確性一般。為了獲得更優(yōu)秀的體驗缆毁,我們可以安裝另一個用于監(jiān) 測文件變動的Python庫Watchdog番川,安裝后Werkzeug會自動使用它來監(jiān)測 文件變動

此外如果項目中使用了單獨的CSS或JavaScript文件時,那么瀏覽器可能會緩存這些文件脊框,從而導致對文件做出的修改不能立刻生效颁督。在瀏覽器中,我們可以按下Crtl+F5或Shift+F5執(zhí)行硬重載(hard reload)浇雹,即忽略緩存并重載(刷新)頁面沉御。


1.5 Flask擴展


我們將會接觸到很多Flask擴展。擴展(extension)即使用 Flask提供的API接口編寫的Python庫昭灵,可以為Flask程序添加各種各樣的功能吠裆。大部分Flask擴展用來集成其他庫,作為Flask和其他庫之間的薄薄一層膠水虎锚。因為Flask擴展的編寫有一些約定硫痰,所以初始化的過程大致相似。大部分擴展都會提供一個擴展類窜护,實例化這個類,并傳入我們創(chuàng)建的程序實例app作為參數(shù)非春,即可完成初始化過程柱徙。通常,擴展會在傳 入的程序實例上注冊一些處理函數(shù)奇昙,并加載一些配置护侮。

在日常開發(fā)中,大多數(shù)情況下储耐,我們沒有必要重復制造輪子羊初,所以選用擴展可以避免讓項目變得臃腫和復雜竖幔。盡管使用擴展可以簡化操作瞒大,快速集成某個功能苍凛,但同時也會降低靈活性驹溃。如果過度使用擴展纠脾, 在不需要的地方引入添吗,那么相應也會導致代碼不容易維護醋火。更糟糕的是虽画,質量差的擴展可能還會帶來潛在的Bug哟旗,而不同擴展之間也可能會出現(xiàn)沖突贩据。因此栋操,在編寫程序時,應該盡量從實際需求出發(fā)饱亮,只在需要的時候使用擴展矾芙,并把擴展的質量和兼容性作為考慮因素,盡量在效率和靈活性之間達到平衡近上。


1.6 項目配置


在很多情況下剔宪,你需要設置程序的某些行為,這時你就需要使用配置變量戈锻。在Flask中歼跟,配置變量就是一些大寫形式的Python變量,你也可 以稱之為配置參數(shù)或配置鍵格遭。使用統(tǒng)一的配置變量可以避免在程序中以硬編碼(hard coded)的形式設置程序哈街。

在一個項目中,你會用到許多配置:Flask提供的配置拒迅,擴展提供的配置骚秦,還有程序特定的配置。和平時使用變量不同璧微,這些配置變量都通過Flask對象的app.config屬性作為統(tǒng)一的接口來設置和獲取作箍,它指向的 Config類實際上是字典的子類,所以你可以像操作其他字典一樣操作 它前硫。
Flask提供了很多種方式來加載配置胞得。比如,你可以像在字典中添加 一個鍵值對一樣來設置一個配置:

app.config['ADMIN_NAME'] = 'Peter'
#配置的名稱必須是全大寫形式屹电,小寫的變量將不會被讀取阶剑。

使用update()方法則可以一次加載多個值:
app.config.update(    TESTING=True, 
                            SECRET_KEY='_5#yF4Q8z\n\xec]/' )

除此之外,你還可以把配置變量存儲在單獨的Python腳本危号、JSON 格式的文件或是Python類中牧愁,config對象提供了相應的方法來導入配 置,具體我們會在后面了解外莲。

#和操作字典一樣猪半,讀取一個配置就是從config字典里通過將配置變 量的名稱作為鍵讀取對應的值:
value = app.config['ADMIN_NAME']


1.7 URL與端點


在Web程序中,URL無處不在偷线。如果程序中的URL都是以硬編碼的方式寫出磨确,那么將會大大降低代碼的易用性。比如淋昭,當你修改了某個路由的URL規(guī)則俐填,那么程序里對應的URL都要一個一個進行修改。更好的解決辦法是使用Flask提供的url_for()函數(shù)獲取URL翔忽,當路由中定義的 URL規(guī)則被修改時英融,這個函數(shù)總會返回正確的URL盏檐。

調用url_for()函數(shù)時,第一個參數(shù)為端點(endpoint)值驶悟。在Flask中胡野,端點用來標記一個視圖函數(shù)以及對應的URL規(guī)則。端點的默認值為視圖函數(shù)的名稱痕鳍。

@app.route('/') 
def index():   
    return 'Hello Flask!'

這個路由的端點即視圖函數(shù)的名稱index硫豆,調用url_for('index')即 可獲取對應的URL,即“/”笼呆。

如果URL含有動態(tài)部分熊响,那么我們需要在url_for()函數(shù)里傳入相 應的參數(shù),以下面的視圖函數(shù)為例:

@app.route('/hello/<name>') 
def greet(name):    
    return 'Hello %s!' % name

這時使用url_for('say_hello'诗赌,name='Jack')得到的URL為“/hello/Jack”汗茄。

我們使用url_for()函數(shù)生成的URL是相對URL(即內部URL), 即URL中的path部分铭若,比如“/hello”洪碳,不包含根URL。相對URL只能在程序內部使用叼屠。如果你想要生成供外部使用的絕對URL瞳腌,可以在使用 url_for()函數(shù)時,將_external參數(shù)設為True镜雨,這會生成完整的URL嫂侍,在本地運行程序時則會獲得 http://localhost:5000/hello


1.8 Flask命令


除了Flask內置的flask run等命令荚坞,我們也可以自定義命令吵冒。在虛擬環(huán)境安裝Flask后,包含許多內置命令的flask腳本就可以使用了西剥。在前面 我們已經(jīng)接觸了很多flask命令,比如運行服務器的flask run亿汞,啟動shell 的flask shell瞭空。

通過創(chuàng)建任意一個函數(shù),并為其添加app.cli.command()裝飾器疗我, 我們就可以注冊一個flask命令咆畏。下面創(chuàng)建了一個自定義的 hello()命令函數(shù),在函數(shù)中我們仍然只是打印一行問候吴裤。

#創(chuàng)建自定義命令

@app.cli.command() 
def hello():   
    click.echo('Hello, Human!')

函數(shù)的名稱即為命令名稱旧找,這里注冊的命令即hello,你可以使用 flask hello命令來觸發(fā)函數(shù)麦牺。作為替代钮蛛,你也可以在app.cli.command() 裝飾器中傳入?yún)?shù)來設置命令名稱鞭缭,比如app.cli.command('say-hello') 會把命令名稱設置為say-hello,完整的命令即flask say-hello魏颓。


1.9 模板與靜態(tài)文件


一個完整的網(wǎng)站需要使用模板(template)和靜態(tài)文件(static file)來生成內容豐富的網(wǎng)頁岭辣。 模板即包含程序頁面的HTML文件,靜態(tài)文件則是需要在HTML文件中加載的CSS甸饱、JavaScript文件沦童,以及圖片、字體文件等資源文件叹话。默認情況下偷遗,模板文件存放在項目根目錄中的templates文件夾中,靜態(tài)文件存放在static文件夾下驼壶,這兩個文件夾需要和包含程序實例的模塊處于同一個目錄下氏豌,對應的項目結構示例如下所示:

hello/   
    - templates/   
    - static/    
    - app.py

在開發(fā)Flask程序時,使用CSS框架和JavaScript庫是很常見的需求辅柴,一般會直接從CDN加載資源或者下載至本地作為本地資源使用箩溃。建議在開發(fā)環(huán)境下自己下載到static目錄下使用本地資源,這樣可以提高加載速度碌嘀,方便統(tǒng)一管理涣旨,出于方便的考慮也可以使用擴展內置的本地資源。在過渡到生產環(huán)境時股冗,自己手動管理所有本地資源或自己設置CDN霹陡,避免使用擴展內置的資源。這個建議主要基于如下考慮因素:
·鑒于國內的網(wǎng)絡狀況止状,擴展默認使用的國外CDN可能會無法訪問或訪問過慢烹棉。
·不同擴展內置的加載方法可能會加載重復的依賴資源,比如 jQuery怯疤。
·在生產環(huán)境下浆洗,將靜態(tài)文件集中在一起更方便管理。
·擴展內置的資源可能會出現(xiàn)版本過舊的情況集峦。
·也存在資源鏈接失效的情況

CDN指分布式服務器系統(tǒng)伏社。服務商把你需要的資源存儲在分布于不 同地理位置的多個服務器,它會根據(jù)用戶的地理位置來就近分配服務器 提供服務(服務器越近塔淤,資源傳送就越快)摘昌。使用CDN服務可以加快網(wǎng)頁資源的加載速度,從而優(yōu)化用戶體驗高蜂。對于開源的CSS和JavaScript 庫聪黎,CDN提供商通常會免費提供服務。


1.10 Flask與MVC架構


MVC架構最初是用來設計桌面程序的备恤,后來也被用于Web程序稿饰,應 用了這種架構的Web框架有Django锦秒、Ruby on Rails等。在MVC架構中湘纵, 程序被分為三個組件:數(shù)據(jù)處理(Model)脂崔、用戶界面(View)、交互邏輯(Controller)梧喷。如果套用MVC架構的內容砌左,那么Flask中視圖函數(shù)的名稱其實并不嚴謹,使用控制器函數(shù)(Controller Function)似乎更合適些铺敌,雖然它也附帶處理用戶界面汇歹。嚴格來說,F(xiàn)lask并不是MVC架構的框架偿凭,因為它沒有內置數(shù)據(jù)模型支持产弹。
粗略歸類,如果想要使用Flask來編寫一個MVC架構的程序弯囊,那么視圖函數(shù)可以作為控制器(Controller)痰哨,視圖(View)則是使用Jinja2渲染的HTML模板,而模型(Model)可以使用其他庫來實現(xiàn)匾嘱,比如SQLAlchemy來創(chuàng)建數(shù)據(jù)庫模型斤斧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霎烙,隨后出現(xiàn)的幾起案子撬讽,更是在濱河造成了極大的恐慌,老刑警劉巖悬垃,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件游昼,死亡現(xiàn)場離奇詭異,居然都是意外死亡尝蠕,警方通過查閱死者的電腦和手機烘豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來看彼,“玉大人扇谣,你說我怎么就攤上這事∠姓眩” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵靡挥,是天一觀的道長序矩。 經(jīng)常有香客問我,道長跋破,這世上最難降的妖魔是什么簸淀? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任瓶蝴,我火速辦了婚禮,結果婚禮上租幕,老公的妹妹穿的比我還像新娘舷手。我一直安慰自己,他們只是感情好劲绪,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布男窟。 她就那樣靜靜地躺著,像睡著了一般贾富。 火紅的嫁衣襯著肌膚如雪歉眷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天颤枪,我揣著相機與錄音汗捡,去河邊找鬼。 笑死畏纲,一個胖子當著我的面吹牛扇住,可吹牛的內容都是我干的。 我是一名探鬼主播盗胀,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼艘蹋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了读整?” 一聲冷哼從身側響起簿训,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎米间,沒想到半個月后强品,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡屈糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年的榛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逻锐。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡夫晌,死狀恐怖,靈堂內的尸體忽然破棺而出昧诱,到底是詐尸還是另有隱情晓淀,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布盏档,位于F島的核電站凶掰,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜懦窘,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一前翎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畅涂,春花似錦港华、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苇经,卻和暖如春赘理,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扇单。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工商模, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜘澜。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓施流,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鄙信。 傳聞我的和親對象是個殘疾皇子瞪醋,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345