Python Web編程

本文翻譯自HOWTO Use Python in the web

摘要

本文提供了一些集成Python和Web服務(wù)器的方法雁竞,以及一些開發(fā)網(wǎng)站有用的實(shí)踐岛都,來展示如何使用Python進(jìn)行web開發(fā)划滋。

Web 2.0專注于讓網(wǎng)站上的用戶生成內(nèi)容,自從它開始媒峡,網(wǎng)絡(luò)編程就成為了熱門話題翠桦。一直以來都可以使用Python創(chuàng)建網(wǎng)站,但這是一個相當(dāng)無聊的任務(wù)糊渊。因此市咆,有很多框架和工具被創(chuàng)造出來,幫助開發(fā)人員創(chuàng)建更快再来,更強(qiáng)大的網(wǎng)站蒙兰。本文描述了一些將Python和Web服務(wù)器組合以創(chuàng)建動態(tài)內(nèi)容的方法磷瘤。這不是一個完整的介紹,因?yàn)檫@個話題過于廣泛搜变,不可能在一篇文章中講清楚采缚。本文會介紹目前最流行的庫。

底層一窺

當(dāng)用戶打開網(wǎng)站時(shí)挠他,他們使用的瀏覽器會連接到該網(wǎng)站的Web服務(wù)器(這被稱之為請求)扳抽。服務(wù)器在文件系統(tǒng)中查找文件,并將其發(fā)回用戶的瀏覽器(這被稱之為響應(yīng))殖侵。這是底層HTTP協(xié)議的大概工作過程贸呢。

動態(tài)網(wǎng)站不是基于文件系統(tǒng)中的文件,而是基于在請求進(jìn)入時(shí)Web服務(wù)器運(yùn)行的程序拢军,由程序生成內(nèi)容返回給用戶楞陷。這些程序可以做各種有用的事情,比如顯示公告板的發(fā)布茉唉,顯示電子郵件固蛾,配置軟件,或者只顯示當(dāng)前時(shí)間度陆。這些程序可以用服務(wù)器支持的任何編程語言編寫艾凯。因?yàn)榇蠖鄶?shù)的服務(wù)器都支持Python,因此可以使用Python輕松地創(chuàng)建動態(tài)網(wǎng)站懂傀。

大多數(shù)的HTTP服務(wù)器軟件是用C或者C++編寫的趾诗,所以它們不能直接執(zhí)行Python代碼。服務(wù)器程序和應(yīng)用程序之間需要一個橋梁蹬蚁。這些橋梁恃泪,或者叫做接口,定義了程序如何與服務(wù)器進(jìn)行交互缚忧。對于這樣的接口悟泵,已經(jīng)有了很多很好的嘗試,但是只有一些值得一提闪水。

不是所有的Web服務(wù)器都支持所有的接口糕非。很多Web服務(wù)器只支持舊的,已過時(shí)的接口球榆;不過朽肥,它們通常可以使用第三方模塊進(jìn)行擴(kuò)展持钉,以支持較新的模塊衡招。

通用網(wǎng)關(guān)接口

通用網(wǎng)關(guān)接口,通常叫做CGI每强,是最古老的接口始腾,幾乎所有的Web服務(wù)器都支持州刽。Web服務(wù)器通過啟動CGI程序來處理請求。對于Python程序來說浪箭,每個請求都會啟動一個新的Python解釋器穗椅,這需要一些時(shí)間,因而整個服務(wù)只能用于低負(fù)載的情況奶栖。

CGI的優(yōu)勢在于它很簡單匹表,編寫一個使用CGI的Python程序只需要大概3行代碼。這種簡單是有代價(jià)的宣鄙,就是它對于開發(fā)者的支持不夠袍镀。

現(xiàn)在已經(jīng)不再推薦編寫CGI程序了。使用WSGI可以編寫兼容CGI的程序冻晤,并作為CGI程序運(yùn)行苇羡。

簡單的CGI腳本

可以用下面的小程序測試Web服務(wù)器是否支持CGI

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import cgitb
cgitb.enable()
print "Content-Type: text/plain;charset=utf-8"
print

print "Hello World!"

根據(jù)Web服務(wù)器的配置,可能需要使用.py或.cgi擴(kuò)展名來保存上面的代碼明也。另外宣虾,處于安全考慮惯裕,代碼文件可能需要保存到cgi-bin文件夾温数。

你可能會疑惑cgitb是用來干嘛的。在發(fā)生異常時(shí)蜻势,該庫會返回一些棾糯蹋回溯信息,而不是在瀏覽器上簡單返回"Internal Server Error"握玛。這對調(diào)試非常有用够傍,但可能會將一些機(jī)密數(shù)據(jù)暴露給用戶。所以不能在生產(chǎn)環(huán)境中使用cgitb挠铲。開發(fā)者應(yīng)該總是捕獲異常冕屯,并顯示正確的錯誤頁面,終端用戶不喜歡在瀏覽器中看到"Internal Server Errors"拂苹。

CGI腳本的常見問題

使用CGI的過程中可能會有一些坑導(dǎo)致腳本不能運(yùn)行安聘。有時(shí),一個看似正確的腳本可能因?yàn)橐恍┖茈y發(fā)現(xiàn)的問題導(dǎo)致不能正常工作瓢棒。

下面是其中的一些問題:

  • Python腳本沒有可執(zhí)行權(quán)限浴韭。當(dāng)CGI腳本不可執(zhí)行時(shí),大多數(shù)Web服務(wù)器會讓用戶下載這個腳本脯宿,而不是運(yùn)行腳本將輸出返回給用戶念颈。要使CGI腳本在類Unix操作系統(tǒng)上正常運(yùn)行,可以使用chmod a+x your_script.py來解決這個問題连霉。
  • 在類Unix系統(tǒng)上榴芳,程序文件中的行結(jié)尾必須是Unix樣式行尾嗡靡。這很重要,因?yàn)閃eb服務(wù)器會檢查腳本的第一行(稱為shebang)窟感,并嘗試運(yùn)行在那里指定的程序叽躯。它很容易被Windows的換行符(回車和換行,也稱為CRLF)困惑肌括,所以必須將文件轉(zhuǎn)換為Unix行結(jié)尾(LF)点骑。在通過FTP上傳文件時(shí),可以通過文本模式而不是二進(jìn)制模式來自動完成這一轉(zhuǎn)換谍夭,但是首選的方法是告訴編輯器使用Unix行結(jié)尾來保存文件黑滴。大多數(shù)編輯器都支持這一功能。
  • Web服務(wù)器必須能夠讀取該腳本紧索,所以需要確保權(quán)限正確袁辈。在類Unix系統(tǒng)上,服務(wù)器程序的用戶和組通常是www-data珠漂,所以可能得更改文件的所有權(quán)晚缩,或者使用chmod a+r your_script.py
  • Web服務(wù)器器必須要知道訪問的是CGI腳本媳危。檢查服務(wù)器配置荞彼,因?yàn)榉?wù)器可能只期望具有特定擴(kuò)展名的文件為CGI腳本。
  • 在類Unix系統(tǒng)中待笑,shebang(#!/usr/bin/env python)中的路徑必須是正確的鸣皂。該行調(diào)用/usr/bin/env來查找Python的路徑,但是如果Python在服務(wù)器的路徑不存在暮蹂,或者/usr/bin/env不存在的話寞缝,調(diào)用將會失敗。

mod_python

PHP的使用者通常會發(fā)現(xiàn)仰泻,很難使用Python進(jìn)行Web開發(fā)荆陆。他們首先想到的是使用mod_python,因?yàn)樗麄冋J(rèn)為這和mod_php是一樣的集侯。事實(shí)上被啼,這兩個是有不同的。mod_python將Python解釋器嵌入到Apache進(jìn)程中浅悉,這樣不必為每個請求啟動Python解釋器趟据,從而加快請求。另一方面术健,它不是Python與HTML的混合汹碱,PHP通常與HTML混合。Python中達(dá)到類似效果的是模版引擎荞估。mod_python本身更為強(qiáng)大咳促,并提供對Apache內(nèi)部組件的更多訪問稚新。它可以模仿CGI,工作在“Python-頁面”模式(類似于JSP)跪腹,這個模式讓Python可以和HTML混合使用褂删,它有一個“發(fā)布者”來指定一個文件來接受和處理所有請求。

不過mod_python有一些問題冲茸。和PHP解釋器不同屯阀,Python解釋器在執(zhí)行文件的時(shí)候會有緩存,因此對文件的更改需要重新啟動Web服務(wù)器轴术。另一個問題是难衰,Apache通過啟動子進(jìn)程來處理請求,不幸的是逗栽,所有的子進(jìn)程都要加載整個Python解釋器盖袭。這會讓服務(wù)器更慢。還有一個問題彼宠,mod_python與特定版本的libpython鏈接鳄虱,所以不可能在不重新編譯的情況下從舊版本切換到新版本。mod_python和apache是綁定的凭峡,所以為mod_python編寫的程序在其他服務(wù)器上不能輕易運(yùn)行拙已。

這些就是避免使用mod_python編寫程序的原因。在某些情況下想罕,可以考慮使用mod_python進(jìn)行部署悠栓,但是WSGI程序也可以在mod_python下運(yùn)行霉涨。

FastCGi和SCGI

FastCGI和SCGI嘗試通過另外一種方式解決CGI的性能問題按价。它不再將解釋器嵌入到Web服務(wù)器中,而是創(chuàng)建長時(shí)間運(yùn)行的后臺程序笙瑟。Web服務(wù)器中的一個模塊使得其可以與后臺進(jìn)程通信楼镐。由于后臺進(jìn)程獨(dú)立于服務(wù)器,因此它可以用任意語言進(jìn)行編寫往枷,包括Python框产。該語言只需要一個處理與Web服務(wù)器通信的庫。

FastCGi和SCGI的區(qū)別很小错洁,因?yàn)镾CGI本質(zhì)上只是一個更簡單的FastCGI(simpler FastCGI)秉宿。支持SCGI的Web服務(wù)器不多,因此大多數(shù)人都使用FastCGI屯碴。幾乎所有適用于SCGI的內(nèi)容也適用于FastCGI描睦,所以這里只涉及后者。

現(xiàn)在FastCGI不再被直接使用了导而。就像mod_python一樣忱叭,它只用于部署WSGI應(yīng)用程序隔崎。

設(shè)置FastCGI

每種Web服務(wù)器都有自己的特定模塊。

  • Apache有mod_fastcgimod_fcgid韵丑。最開始是mod_fastcgi爵卒,但是它有一些許可問題,有時(shí)被認(rèn)為是非免費(fèi)的撵彻。mod_fcgid是一個較小的钓株,兼容的替代方案。Apache需要加載其中一個模塊陌僵。
  • lighttpd同時(shí)有FastCGI moduleSCGI module
  • nginx也支持FastCGI享幽。

安裝和配置好上面模塊后,可以用下面的程序測試一下拾弃。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from cgi import escape
import sys, os
from flup.server.fcgi import WSGIServer

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    
    yield '<h1>FastCGI Environment</h1>'
    yield '<table>'
    for k, v in sorted(environ.items()):
        yield '<tr><th>%s</th><td>%s</td><tr>' % (escape(k), escape(v))
    yield '</table>'
    
WSGIServer(app).run()

這就是一個簡單的WSGi應(yīng)用程序值桩,但是首先需要安裝flup來處理底層的FastCGI訪問。

mod_wsgi

mod_wsgi試圖擺脫網(wǎng)關(guān)豪椿。FastCGi奔坟,SCGI和mod_python主要用于部署WSGI應(yīng)用程序,mod_wsgi直接將WSGI應(yīng)用程序嵌入Apache Web服務(wù)器搭盾。mod_wsgi專門用于承載WSGI應(yīng)用程序咳秉。和其他需要使用膠水代碼來部署的方法比較起來,使用mod_wsgi部署起來更加容易鸯隅。缺點(diǎn)是mod_wsgi僅限于Apache Web服務(wù)器;其他服務(wù)器需要自己的mod_wsgi實(shí)現(xiàn)澜建。

mod_wsgi支持兩種模式:集成Apache進(jìn)程的嵌入模式和FastCGi類似的守護(hù)模式。和FastCGi不同蝌以,mod_wsgi可以自己處理工作進(jìn)程炕舵,這使得管理起來更加容易。

WSGI

在前面已經(jīng)多次提到了WSGI跟畅,現(xiàn)在來解釋它的重要性咽筋。

WSGI全稱是Web服務(wù)器網(wǎng)關(guān)接口,PEP 333中定義了它徊件,目前是Python Web編程的最佳方式奸攻。它一般會用來編寫框架,一般的Web開發(fā)人員并不需要直接接觸它虱痕。在選擇Web開發(fā)框架時(shí)睹耐,最好選擇支持WSGI的框架。

WSGI的最大優(yōu)點(diǎn)就是統(tǒng)一了應(yīng)用程序編程接口部翘。如果使用的框架支持WSGI硝训,那么應(yīng)用程序就能在所有支持WSGI的Web服務(wù)器上進(jìn)行部署。應(yīng)用程序并不需要關(guān)心部署使用的是mod_python或FastCGi或者mod_wsgi--使用WSGi,應(yīng)用程序?qū)⒛茉谠谌魏尉W(wǎng)關(guān)接口上運(yùn)行捎迫。Python標(biāo)準(zhǔn)庫包含自己的WSGi服務(wù)器wsgiref晃酒,它是一個可用于測試的小型Web服務(wù)器。

WSGI一個非常好的特性是中間件窄绒。中間件是應(yīng)用程序的一層贝次,可以在其中添加各種功能。已經(jīng)有很多的中間件存在了彰导。比如蛔翅,不用再編寫自己的會話管理(HTTP是無狀態(tài)協(xié)議,因此要將多個HTTP請求與單個用戶關(guān)聯(lián)位谋,應(yīng)用程序必須通過會話創(chuàng)建和管理此類狀態(tài))山析,只需要下載會話管理中間件,將其插入應(yīng)用掏父,然后就能進(jìn)行應(yīng)用相關(guān)的特定邏輯的編碼了笋轨。同樣的,現(xiàn)在也有中間件可以使用gzip處理壓縮HTML赊淑,來節(jié)省服務(wù)器的寬帶爵政。也可以使用現(xiàn)有中間件輕松解決認(rèn)證問題。

雖然WSGI可能看起來很復(fù)雜陶缺,但初始階段的學(xué)習(xí)是非常有益的钾挟,因?yàn)閷﹂_發(fā)網(wǎng)中中出現(xiàn)的問題,WSGI和相關(guān)的中間件很有可能已經(jīng)有了解決方案饱岸。

WSGI服務(wù)器

用于連接到各種底層網(wǎng)關(guān)(如CGI和mod_python)的代碼被稱為WSGI服務(wù)器掺出。flup就是一個WSGI服務(wù)器,它支持FastCGi苫费,SCGI和AJP汤锨。部分服務(wù)器使用Python編寫,比如flup黍衙,還存在其他以C編寫的服務(wù)器泥畅,可以用作插入式替換。

已經(jīng)有很多WSGI服務(wù)器存在了琅翻,所以Python Web應(yīng)用幾乎可以在任何地方部署。這是Python與其他網(wǎng)絡(luò)技術(shù)相比的一大優(yōu)勢柑贞。

模型-視圖-控制器

通常在“框架**支持MVC”這樣的語句中聽到MVC這個術(shù)語方椎。MVC更多地關(guān)心代碼的整體組織,而不是任何特定的API钧嘶。很多Web框架使用這個模型來幫助開發(fā)人員管理程序的結(jié)構(gòu)棠众。大型的Web應(yīng)用程序可以有很多代碼,因此最好在一開始就擁有一個有效的結(jié)構(gòu)。這樣闸拿,即使是其他框架的用戶(甚至其他語言)也可以很容易地理解代碼空盼,因?yàn)樗麄儗VC已經(jīng)很熟悉了。

MVC把軟件系統(tǒng)分為三個基本部分:

  • 模型新荤。用于呈現(xiàn)和修改的數(shù)據(jù)揽趾。在Python框架中,這個組件通常類來表示對象關(guān)系映射器苛骨。
  • 視圖篱瞎。該組件的任務(wù)是向用戶展示模型的數(shù)據(jù)。通常痒芝,該組件通過模版實(shí)現(xiàn)俐筋。
  • 控制器。負(fù)責(zé)轉(zhuǎn)發(fā)請求严衬,對請求進(jìn)行處理澄者。

可能有人會認(rèn)為MVC是一個復(fù)雜的設(shè)計(jì)模式,其實(shí)并不是请琳。它被用于Python闷哆,因?yàn)樗驯蛔C明可以用于創(chuàng)建干凈,可維護(hù)的網(wǎng)站单起。

構(gòu)建網(wǎng)站的工具

網(wǎng)站是很復(fù)雜的抱怔,有一些工具可以幫助Web開發(fā)人員使代碼更易于編寫和維護(hù)。所有編程語言嘀倒,所有框架中都有這樣的工具屈留。開發(fā)者并不會被強(qiáng)制要求使用這些工具,通常也不存在最好的工具测蘑。不過開發(fā)者有必要學(xué)一些這樣的工具灌危,來簡化網(wǎng)站的開發(fā)過程。

模版

可以通過一個庫來使HTML和Python代碼混合碳胳。這樣做剛開始的時(shí)候很方便勇蝙,但是會導(dǎo)致代碼變得不可維護(hù)。這就是模版誕生的背景挨约。在最簡單的情況下味混,模版只是帶有占位符的HTML文件。在填寫占位符后诫惭,HTML文件將會返回給用戶的瀏覽器翁锡。

Python已經(jīng)有兩種方式構(gòu)建簡單的模版了:

>>> template = "<html><body><h1>Hello %s!</h1></body></html>"
>>> from string import Template
>>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")
>>> print template.substitute(dict(name='Dinsdale'))
<html><body><h1>Hello Dinsdale</h1></body></html>

為了基于復(fù)雜的模型數(shù)據(jù)生成復(fù)雜的HTML,通常需要像Python的forif
這樣的控制語句夕土。模版引擎支持這樣復(fù)雜的模版馆衔。

Python有很多可用的模版引擎瘟判。其中的一些定義了一種易于學(xué)習(xí)的純文本編程語言,易學(xué)習(xí)的部分原因在于其范圍有限角溃。其他的引擎使用XML拷获,模版輸出保證始終是有效的XML。還有很多其他的變種减细。

一些框架自帶模版引擎或者推薦像用戶推薦一個匆瓜。在沒有理由使用其他引擎的情況下,最好使用由框架提供或者推薦的模版引擎邪财。

流行的模版引擎包括

數(shù)據(jù)持久化

聽起來非常復(fù)雜陕壹,但是數(shù)據(jù)持久化只是數(shù)據(jù)存儲。該數(shù)據(jù)可能是博客條目的內(nèi)容树埠,公告板上的帖子糠馆,或者Wiki頁面的文本。當(dāng)然,在Web服務(wù)器上存儲信息的方法有很多種。

通常會使用像MySQLPostgreSQL這樣的關(guān)系數(shù)據(jù)庫引擎阵幸,因?yàn)樗鼈冊谔幚碛蓴?shù)百萬個條目組成的大型數(shù)據(jù)時(shí)具有良好的性能熙兔。也有像SQLite這樣的小型數(shù)據(jù)庫引擎椎扬,它通過sqlite3模塊和Python捆綁,僅使用一個文件。它沒有其他的依賴,對于小網(wǎng)站而言皂岔,使用SQLite就足夠了。

關(guān)系型數(shù)據(jù)庫通過SQL查詢數(shù)據(jù)展姐。Python程序員通常不太喜歡使用SQL躁垛,因?yàn)樗麄兿矚g使用對象』浚可以使用ORM(對象關(guān)系映射)技術(shù)將Python對象保存在數(shù)據(jù)庫中教馆。ORM將所有面向?qū)ο蟮脑L問轉(zhuǎn)換成SQL語句。大多數(shù)的框架都使用ORM擂达。

第二種做法是將數(shù)據(jù)存儲在普通的文本文件中(有時(shí)稱為“平面文件”)土铺。這對于簡單站點(diǎn)來說非常好用,但是如果網(wǎng)站對存儲的數(shù)據(jù)執(zhí)行許多更新操作板鬓,則難以保持?jǐn)?shù)據(jù)的正確悲敷。

第三種方案是面向?qū)ο蟮臄?shù)據(jù)庫(也稱為“對象數(shù)據(jù)庫”)。這些數(shù)據(jù)庫將數(shù)據(jù)與程序運(yùn)行時(shí)內(nèi)存中的數(shù)據(jù)以相同的結(jié)構(gòu)存儲穗熬。(相比之下镀迂,ORM將對象數(shù)據(jù)作為表中的數(shù)據(jù)行和這些行之間的關(guān)系存儲。)直接存儲對象的優(yōu)點(diǎn)在于幾乎所有的對象都可以以直接的方式保存唤蔗,而關(guān)系型數(shù)據(jù)庫中,很難用對象表示數(shù)據(jù)。

框架通常會對使用的存儲類型作出提示妓柜。最好使用框架推薦的類型箱季,除非應(yīng)用有特殊的有求。

框架

創(chuàng)建網(wǎng)站包括編寫代碼以提供各種服務(wù)棍掐。不論網(wǎng)站的復(fù)雜程度或者目的藏雏,提供特定服務(wù)的代碼通常以相同的方式工作。將這些常見的解決方案提取到可重用的代碼中作煌,產(chǎn)生了用于Web開發(fā)的所謂的“框架”掘殴。也許最有名的Web開發(fā)框架是Ruby on Rails,但是Python有自己的框架粟誓。其中的一部分來自Rails的啟發(fā)奏寨,或者借鑒了Rails的想法,但有很多框架在Rails之前就出現(xiàn)了鹰服。

最初病瞳,Python Web框架傾向于將開發(fā)網(wǎng)站所需的所有服務(wù)納入到一個巨大的集成工具中。任何兩個框架之間都是不能互相合作的:為一個框架開發(fā)的程序悲酷,不能不經(jīng)巨大修改就部署在另外一個的框架上套菜。這導(dǎo)致了“極簡”Web框架的開發(fā),這種框架提供工具來完成Python代碼和http協(xié)議之間的通信设易,其他的服務(wù)單獨(dú)將以組件的形式加入應(yīng)用逗柴。一些特殊的標(biāo)準(zhǔn)被開發(fā)出來,來允許框架之間的有限互操作性顿肺,例如允許不同的模版引擎互換使用的標(biāo)準(zhǔn)戏溺。

自從WSGI出現(xiàn)以來,Python Web框架向基于WSGI標(biāo)準(zhǔn)的互操作性的方向發(fā)展⌒冢現(xiàn)在于购,許多Web框架,無論是“全椫荆”(提供部署最復(fù)雜的網(wǎng)站所需的所有工具)和最簡單的肋僧,都是由可重復(fù)使用的組件的集合構(gòu)建的,這些組件可以在多個框架中使用控淡。

大多數(shù)用戶想要選擇的是一個具有活躍社區(qū)的“全椣臃停”框架。這些框架往往由很好的文檔掺炭,并提供了簡單的方式在最短時(shí)間內(nèi)生成功能完整的網(wǎng)站辫诅。

一些有名的框架

框架的數(shù)量多的令人難以置信,因此這里只介紹幾個最流行的框架涧狮。

Django

Django是由幾個耦合緊密的組件組成的框架炕矮。它包含了一個強(qiáng)大易用的ORM和數(shù)據(jù)在線管理平臺么夫。模版引擎是基于文本的,為不懂Python的設(shè)計(jì)人員設(shè)計(jì)肤视。它支持模版繼承和過濾器(類似于Unix管道)档痪。Django捆綁了很多方便的功能,如創(chuàng)建RSS源或通用視圖邢滑,這使得不寫一行Python代碼來創(chuàng)建網(wǎng)站變的可能腐螟。

它有一個人數(shù)眾多的國際化社區(qū),其中的成員已經(jīng)創(chuàng)建了很多網(wǎng)站困后。還有很多附加項(xiàng)目可以擴(kuò)展Django的正常功能乐纸。這部分歸功于Django維護(hù)良好的在線文檔Django book

TurboGears

另外一個流行的庫是TurboGears摇予。TurboGears采用已經(jīng)存在的組件汽绢,并通過膠水代碼來創(chuàng)建無縫體驗(yàn)的方法。TurboGears為用戶提供了選擇組件的靈活性趾盐。例如庶喜,ORM和模版引擎可以更改為使用與默認(rèn)庫不同的庫。

文檔見這里救鲤,其中可以找到Screencast的鏈接久窟。

“本譯文僅供個人研習(xí)、欣賞語言之用本缠,謝絕任何轉(zhuǎn)載及用于任何商業(yè)用途斥扛。本譯文所涉法律后果均由本人承擔(dān)。本人同意簡書平臺在接獲有關(guān)著作權(quán)人的通知后丹锹,刪除文章稀颁。”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楣黍,一起剝皮案震驚了整個濱河市匾灶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌租漂,老刑警劉巖阶女,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哩治,居然都是意外死亡秃踩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門业筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憔杨,“玉大人,你說我怎么就攤上這事蒜胖∠穑” “怎么了抛蚤?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妖啥。 經(jīng)常有香客問我霉颠,道長对碌,這世上最難降的妖魔是什么荆虱? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮朽们,結(jié)果婚禮上怀读,老公的妹妹穿的比我還像新娘。我一直安慰自己骑脱,他們只是感情好菜枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叁丧,像睡著了一般啤誊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拥娄,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天蚊锹,我揣著相機(jī)與錄音,去河邊找鬼稚瘾。 笑死牡昆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摊欠。 我是一名探鬼主播丢烘,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼些椒!你這毒婦竟也來了播瞳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤免糕,失蹤者是張志新(化名)和其女友劉穎赢乓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體说墨,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骏全,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尼斧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姜贡。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棺棵,靈堂內(nèi)的尸體忽然破棺而出楼咳,到底是詐尸還是另有隱情熄捍,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布母怜,位于F島的核電站余耽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苹熏。R本人自食惡果不足惜碟贾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轨域。 院中可真熱鬧袱耽,春花似錦、人聲如沸干发。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枉长。三九已至冀续,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間必峰,已是汗流浹背洪唐。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留自点,地道東北人桐罕。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像桂敛,于是被迫代替她去往敵國和親功炮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • 談?wù)揥EB編程的時(shí)候常說天天在寫CGI术唬,那么CGI是什么呢薪伏?可能很多時(shí)候并不會去深究這些基礎(chǔ)概念,再比如除了CGI...
    __七把刀__閱讀 2,180評論 2 11
  • 分享一篇文章粗仓,總結(jié)了很多Python Web 部署的內(nèi)容嫁怀,原文位于:Python Web部署方式總結(jié) 不要讓服務(wù)器...
    妄心xyx閱讀 820評論 0 13
  • 學(xué)過PHP的都了解,php的正式環(huán)境部署非常簡單借浊,改幾個文件就OK塘淑,用FastCgi方式也是分分鐘的事情。相比起...
    chen_000閱讀 2,102評論 0 1
  • 學(xué)過PHP的都了解蚂斤,php的正式環(huán)境部署非常簡單存捺,改幾個文件就OK,用FastCgi方式也是分分鐘的事情。相比起來...
    妄心xyx閱讀 1,365評論 0 22
  • 今天下午我們有些人到二《1》班寫作業(yè)我和劉思穎兼吓、師趙韻、馬子川去了森枪,還有七個人我們到那里二《1》班也有一些人视搏,然后...
    芙蓉花開_ba44閱讀 181評論 0 0