django開發(fā)實(shí)戰(zhàn)筆記

參考博客

URL調(diào)度器 | Django 文檔 | Django
python引入模塊報(bào)錯ValueError: attempted relative import beyond top-level package
Django更新models數(shù)據(jù)庫結(jié)構(gòu)步驟
畫圖

代碼地址:github倉庫代碼地址
書籍鏈接:書籍下載 密碼:8888

git倉庫

git add . && git commit -m "new commit" && git push  -u origin master

創(chuàng)建一個django項(xiàng)目

cd 任意目錄
django-admin startproject student_sys     #在該目錄生成django項(xiàng)目目錄結(jié)構(gòu)

后臺

  • 創(chuàng)建app(student)蓖乘,并創(chuàng)建數(shù)據(jù)庫model.py遂蛀,構(gòu)造數(shù)據(jù)顯示admin.py
  • 注冊app(student)到主應(yīng)用中

創(chuàng)建一個app项秉,在app中寫代碼

cd student_sys
python manage.py startapp student

建立數(shù)據(jù)庫app/models.py

# 修改app/models.py
from django.db import models

# Create your models here.
class Student(models.Model):
    # 列表里面套元祖,供choices中做選擇
    SEX_ITEMS = [
        ('1','男'),
        ('2','女'),
        ('0','未知'),
    ]

    STATUS_ITEMS = [
        (0,'申請'),
        (1,'通過'),
        (2,'拒絕'),
    ]
    name = models.CharField(max_length=128,verbose_name='姓名')
    sex = models.CharField(max_length=12,choices=SEX_ITEMS,verbose_name='性別')
    profession = models.CharField(max_length=128,verbose_name='職業(yè)')
    email = models.EmailField(verbose_name="Email")
    qq = models.CharField(max_length=128,verbose_name="QQ")
    phone = models.CharField(max_length=128,verbose_name="電話")

    #choice選擇列表套元祖,IntegerField()
    status = models.IntegerField(choices=STATUS_ITEMS,verbose_name="審核狀態(tài)")
    created_time = models.DateTimeField(auto_now_add=True,editable=False,verbose_name="創(chuàng)建時(shí)間")

    def __unicode__(self):
        return '<Student: {}>'.format(self.name)
'''
如我們的Model中實(shí)現(xiàn)了``__unicode__``方法卒废,保證在Python2中運(yùn)行時(shí),
直接print(或者直接在web界面展示) student對象時(shí)爆班,
能看到``<Student: [name]>``這樣的字樣花嘶,而不是Python中的``object xxxxx``這樣?xùn)|西。
'''
    class Meta:
        verbose_name = verbose_name_plural = "學(xué)員信息"

構(gòu)造數(shù)據(jù)庫顯示

#修改字段顯示
from django.contrib import admin
from .models import Student
# Register your models here.

class StudentAdmin(admin.ModelAdmin):
    list_display = ('id','name','sex','profession')
    list_filter = ('sex','status','created_time')
    search_fields = ('name','profession')
    fieldsets = (
        (None, {
         'fields': (
                 'name',
                 ('sex', 'profession'),
                 ('email', 'qq', 'phone'),
                 'status',
                 )
         }),
    )

admin.site.register(Student, StudentAdmin)   #將數(shù)據(jù)庫類Student與StudentAdmin類綁定

生成表

cd student_house/student_sys/
python manage.py makemigrations  # 創(chuàng)建遷移文件
python manage.py migrate    #創(chuàng)建表
python manage.py createsuperuser    #根據(jù)提示阅酪,輸出用戶名旨袒,郵箱,密碼

啟動項(xiàng)目

python manage.py runserver  #啟動項(xiàng)目

訪問: http://127.0.0.1:8000术辐,看到一個提示頁,這是因?yàn)槲覀冞€沒開發(fā)首頁施无。我們可以進(jìn)入到admin的頁面: http://127.0.0.1:8000/admin/辉词。用你創(chuàng)建好的賬戶登錄,就能看到一個完整的帶有CURD的后臺了猾骡。

  • 測試訪問


配置中文

  • 修改settings
# settings最下面修改
LANGUAGE_CODE = 'zh-hans'  # 語言

TIME_ZONE = 'Asia/Shanghai'  # 時(shí)區(qū)

USE_I18N = True  # 語言

USE_L10N = True  # 數(shù)據(jù)和時(shí)間格式

USE_TZ = True  # 啟用時(shí)區(qū)
# 瀏覽器刷新后訪問的是中文界面

前臺

  • app/views.py
<!DOCTYPE html>
<html>
    <head>
        <title>學(xué)員管理系統(tǒng)-by the5fire</title>
    </head>
    <body>
        Hello {{ words }}!
    </body>
</html>
  • app/templates/index.html
from django.shortcuts import render

# Create your views here.

def index(request):
    words = 'World!'
    return render(request,'index.html',context={'words': words})

路由配置

  • 主目錄/urls.py
from django.contrib import admin
from django.urls import path,re_path
from student import views

urlpatterns = [
    re_path('^$', views.index, name='index'),
    path('admin/', admin.site.urls)
]

html遍歷輸出數(shù)據(jù)

html

<!DOCTYPE html>
<html>
    <head>
        <title>學(xué)員管理系統(tǒng)-by the5fire</title>
    </head>
    <body>
        <ul>
        {% for student in students %}
            <li>{{ student.name }} - {{ student.get_status_display }}</li>
        {% endfor %}
        </ul>
    </body>
</html>
# student.get_status_display對應(yīng)status = models.IntegerField(choices=STATUS_ITEMS,verbose_name="審核狀態(tài)")
動態(tài)方法轉(zhuǎn)靜態(tài)調(diào)用瑞躺,取出了status中的choices值

views.py/render

from django.shortcuts import render
from .models import Student   #導(dǎo)入model中的學(xué)生類,返回?cái)?shù)據(jù)
# Create your views here.

# def index(request):
#     words = 'World!'
#     return render(request,'index.html',context={'words': words})


def index(request):
    students = Student.objects.all()
    return render(request,'index.html',context={'students': students})

forms.py提交數(shù)據(jù)

  • 方法1
from django import forms
from .models import Student
class StudentForm(forms.Form):
    name = forms.CharField(label='姓名', max_length=128)
    sex = forms.ChoiceField(label='性別', choices=Student.SEX_ITEMS)
    profession = forms.CharField(label='職業(yè)', max_length=128)
    email = forms.EmailField(label='郵箱', max_length=128)
    qq = forms.CharField(label='QQ', max_length=128)
    phone = forms.CharField(label='手機(jī)', max_length=128)
  • 方法2
    復(fù)用Model的代碼
    model=Student(Student是)
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = (
            'name', 'sex', 'profession',
            'email', 'qq', 'phone'
        )

項(xiàng)目文件結(jié)構(gòu)


forms.py提交數(shù)據(jù)修改字段類型判斷

from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
    def clean_qq(self):
        cleaned_data = self.cleaned_data['qq']
        if not cleaned_data.isdigit():
            raise forms.ValidationError('必須是數(shù)字兴想!')

        return int(cleaned_data)

    class Meta:
        model = Student
        fields = ('name', 'sex', 'profession','email', 'qq', 'phone')

'''
其中``clean_qq``就是Django的form會自動調(diào)用幢哨,來處理每個字段的方法,
比如在這個form中你可以通過定義``clean_phone``來處理電話號碼嫂便,
可以定義``clean_email``來處理郵箱等等捞镰。如果驗(yàn)證失敗,
可以通過``raise forms.ValidationError('必須是數(shù)字毙替!')``的方式返回錯誤信息岸售,
這個信息會存儲在form中,最終會被我們渲染到頁面上厂画。
'''

form.py對應(yīng)views.py

from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render

from .models import Student
from .forms import StudentForm

def index(request):
    students = Student.objects.all()
    if request.method == 'POST':
        form = StudentForm(request.POST)
        if form.is_valid():
            cleaned_data = form.cleaned_data
            student = Student()
            student.name = cleaned_data['name']
            student.sex = cleaned_data['sex']
            student.email = cleaned_data['email']
            student.profession = cleaned_data['profession']
            student.qq = cleaned_data['qq']
            student.phone = cleaned_data['phone']
            student.save()
            return HttpResponseRedirect(reverse('index'))
    else:
        form = StudentForm()

    context = {
        'students': students,
        'form': form,
    }
    return render(request, 'index.html', context=context)

view.py展示form提交的數(shù)據(jù)

<!DOCTYPE html>
<html>
    <head>
        <title>學(xué)員管理系統(tǒng)-by the5fire</title>
    </head>
    <body>
        <h3><a href="/admin/">Admin</a></h3>
        <ul>
            {% for student in students %}
            <li>{{ student.name }} - {{ student.get_status_display }}</li>
            {% endfor %}
        </ul>
        <hr/>
        <form action="/" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>


'''
其中 `{% csrf_token %}`是Django對提交數(shù)據(jù)安全性做的校驗(yàn)凸丸,
這意味著,如果沒有這個token袱院,提交過去的數(shù)據(jù)是無效的屎慢。
這是用來防止跨站偽造請求攻擊的一個手段瞭稼。

{{ form }}只需要這么寫,Django就會幫我們自動把所有字段列出來腻惠。
當(dāng)然环肘,如果需要調(diào)整樣式,那就要自己來增加css樣式文件解決了妖枚。
'''
  • 測試訪問
    異常:django.db.utils.IntegrityError: NOT NULL constraint failed: student_student.status
    form提交時(shí)沒有status選項(xiàng)廷臼,數(shù)據(jù)庫設(shè)置為非null,導(dǎo)致報(bào)錯

分離post绝页,get:Class Based View

'''
分離``get``和``post``的處理邏輯
回頭看下上節(jié)``views.py``中的代碼荠商,其中有一個關(guān)于``request.method``的判斷。我們來通過類級的View去掉層控制語句续誉。
'''
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from django.views import View

from .models import Student
from .forms import StudentForm

class IndexView(View):
    template_name = 'index.html'

    def get_context(self):
        students = Student.objects.all()
        context = {
            'students': students,
        }
        return context

    def get(self, request):
        context = self.get_context()
        form = StudentForm()
        context.update({
            'form': form
        })
        return render(request, self.template_name, context=context)

    def post(self, request):
        form = StudentForm(request.POST)
        if form.is_valid():
            cleaned_data = form.cleaned_data
            student = Student()
            student.name = cleaned_data['name']
            student.sex = cleaned_data['sex']
            student.email = cleaned_data['email']
            student.profession = cleaned_data['profession']
            student.qq = cleaned_data['qq']
            student.phone = cleaned_data['phone']
            student.save()
            return HttpResponseRedirect(reverse('index'))
        context = self.get_context()
        context.update({
            'form': form
        })
        return render(request, self.template_name, context=context)

修改urls

    from django.conf.urls import url
    from django.contrib import admin

    from student.views import IndexView

    urlpatterns = [
        url(r'^$', IndexView.as_view(), name='index'),
        url(r'^admin/', admin.site.urls),
    ]
'''
IndexView.as_view()調(diào)用的是父類方法(django.views.view.as_view())
用來判斷request對象中是否是get還是post方法莱没,再調(diào)用對應(yīng)方法
'''

配置 middleware

創(chuàng)建一個middlewares.py,位于views.py的同級目錄中
目標(biāo):統(tǒng)計(jì)首頁每次訪問所消耗的時(shí)間,也就是wsgi接口或者socket接口接到請求酷鸦,到最終返回的時(shí)間

from django.utils.deprecation import MiddlewareMixin
from django.urls import reverse
import time

class TimeItMiddleware(MiddlewareMixin):
    def process_request(self, request):
        self.start_time = time.time()
        return

    def process_view(self, request, func, *args, **kwargs):
        if request.path != reverse('index'):
            return None

        start = time.time()
        response = func(request)
        costed = time.time() - start
        print('{:.2f}s'.format(costed))
        return response

    def process_exception(self, request, exception):
        pass

    def process_template_response(self, request, response):
        return response

    def process_response(self, request, response):
        costed = time.time() - self.start_time
        print('request to response cose: {:.2f}s'.format(costed))
        return response

settings文件中注冊middleware
--- 注意路徑

MIDDLEWARE = [
    ''student.middlewares.TimeItMiddleware',  #增加當(dāng)前行
    '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',
]
  • process_request - 一個請求來到middelware層饰躲,進(jìn)入的第一個方法。一般情況我們可以在這里做一些校驗(yàn)臼隔,比如用戶登錄嘹裂,或者HTTP中是否有認(rèn)證頭之類的驗(yàn)證。這個方法需要兩種返回值摔握,HttpResponse或者None寄狼,如果返回HttpResponse,那么接下來的處理方法只會執(zhí)行process_response氨淌,其他的方法將不會被執(zhí)行泊愧。這里需要注意的是,如果你的middleware在settings配置的MIDDLEWARE_CLASS的第一個的話盛正,那么剩下的middleware也不會被執(zhí)行删咱。另外一個返回值是None,如果返回None豪筝,那么Django會繼續(xù)執(zhí)行其他的方法痰滋。

  • process_view - 這個方法是在process_request之后執(zhí)行的,參數(shù)如上面代碼所示壤蚜,其中的func就是我們將要執(zhí)行的view方法即寡,因此我們要統(tǒng)計(jì)一個view的執(zhí)行時(shí)間,可以在這里來做袜刷。它的返回值跟process_request一樣聪富,HttpResponse/None,邏輯也是一樣著蟹。如果返回None墩蔓,那么Django會幫你執(zhí)行view函數(shù)梢莽,從而得到最終的Response。

  • process_template_response - 執(zhí)行完上面的方法奸披,并且Django幫忙我們執(zhí)行完view之后昏名,拿到最終的response,如果是使用了模板的Response(是指通過return render(request, 'index.html', context={})的方式返回Response阵面,就會來到這個方法中轻局。這個方法中我們可以對response做一下操作,比如Content-Type設(shè)置样刷,或者其他HEADER的修改/增加仑扑。

  • process_response - 當(dāng)所有流程都處理完畢,就來到了這個方法置鼻,這個方法的邏輯跟process_template_response是完全一樣的镇饮。只是process_template_response是針對帶有模板的response的處理。

  • process_exception - 上面的所有處理方法是按順序介紹的,而這個不太一樣。只有在發(fā)生異常時(shí)宣渗,才會進(jìn)入到這個方法。哪個階段發(fā)生的異常呢钙勃?可以簡單的理解為在將要調(diào)用的view中出現(xiàn)異常(就是在process_viewfunc函數(shù)中)或者返回的模板Response在render時(shí)發(fā)生的異常,會進(jìn)入到這個方法中聂喇。但是需要注意的是肺缕,如果你在process_view中手動調(diào)用了func,就像我們上面做的那樣授帕,那就不會觸發(fā)process_exception了。這個方法接收到異常之后浮梢,可以選擇處理異常跛十,然后返回一個含有異常信息的HttpResponse,或者直接返回None秕硝,不處理芥映,這種情況Django會使用自己的異常模板。

  • Middleware中所有方法的執(zhí)行順序和說明


單元測試

TestCase中幾個方法的說明

在Django中運(yùn)行測試用例時(shí)远豺,如果我們用的是sqlite數(shù)據(jù)庫奈偏,Django會幫我們創(chuàng)建一個基于內(nèi)存的測試數(shù)據(jù)庫,用來測試躯护。這意味著我們測試中所創(chuàng)建的數(shù)據(jù)惊来,對我們的開發(fā)環(huán)境或者線上環(huán)境是沒有影響的。

但是對于MySQL數(shù)據(jù)庫棺滞,Django會直接用配置的數(shù)據(jù)庫用戶和密碼創(chuàng)建一個test_student_db的數(shù)據(jù)庫裁蚁,用于測試矢渊,因此需要保證有建表和建庫的權(quán)限。

你也可以定義測試用的數(shù)據(jù)庫的名稱枉证,通過settings配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'mydatabaseuser',
        'NAME': 'mydatabase',
        'TEST': {
            'NAME': 'mytestdatabase',  ## 這里配置
        },
    },
}

下面對需要用到的幾個方法做下說明:

  • def setUp(self) - 如其名矮男,用來初始化環(huán)境,包括創(chuàng)建初始化的數(shù)據(jù)室谚,或者做一些其他的準(zhǔn)備的工作毡鉴。
  • def test_xxxx(self) - 方法后面的xxxx可以是任意的東西,以test_開頭的方法秒赤,會被認(rèn)為是需要測試的方法猪瞬,跑測試時(shí)會被執(zhí)行。每個需要被測試的方法是相互獨(dú)立的倒脓。
  • def tearDown(self) - 跟setUp相對撑螺,用來清理測試環(huán)境和測試數(shù)據(jù)。在Django中崎弃,我們可以不關(guān)心這個甘晤。

Model層測試

這一層的測試,主要是來保證數(shù)據(jù)的寫入和查詢是可用的饲做,同時(shí)也需要保證我們在Model層所提供的方法是符合預(yù)期的线婚。比如我們的Model中實(shí)現(xiàn)了__unicode__方法,保證在Python2中運(yùn)行時(shí)盆均,直接print(或者直接在web界面展示) student對象時(shí)塞弊,能看到<Student: [name]>這樣的字樣,而不是Python中的object xxxxx這樣?xùn)|西泪姨。

我們來看下代碼:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.test import TestCase

from .models import Student


class StudentTestCase(TestCase):
    def setUp(self):
        Student.objects.create(
            name='test',
            sex=1,
            email='333@dd.com',
            profession='程序員',
            qq='3333',
            phone='32222',
        )

    def test_create_and_unicode(self):
        student = Student.objects.create(
            name='test',
            sex=1,
            email='333@dd.com',
            profession='程序員',
            qq='3333',
            phone='32222',
        )
        student_name = '<Student: test>'
        self.assertEqual(unicode(student), student_name, 'student __unicode__ must be {}'.format(student_name))

    def test_filter(self):
        students = Student.objects.filter(name='test')
        self.assertEqual(students.count(), 1, 'only one is right')

setUp我們創(chuàng)建了一條數(shù)據(jù)用于測試游沿。test_create_and_unicode用來測試數(shù)據(jù)創(chuàng)建和自定義的__unicode__方法有效,test_filter測試查詢可用肮砾。

view層測試

這一層更多的是功能上的測試诀黍,也是我們一定要寫的,功能上的可用是比什么都重要的事情仗处。當(dāng)然這事你可以通過手動瀏覽器訪問來測試眯勾,但是如果你有幾百個頁面呢?

這部分的測試邏輯依賴Django提供的Django.test.Client對象婆誓。在上面的文件中tests.py中吃环,我們增加下面兩個函數(shù):

    def test_get_index(self):
        client = Client()
        response = client.get('/')
        self.assertEqual(response.status_code, 200, 'status code must be 200!')

    def test_post_student(self):
        client = Client()
        data = dict(
            name='test_for_post',
            sex=1,
            email='333@dd.com',
            profession='程序員',
            qq='3333',
            phone='32222',
        )
        response = client.post('/', data)
        self.assertEqual(response.status_code, 302, 'status code must be 302!')

        response = client.get('/')
        self.assertTrue(b'test_for_post' in response.content, 'response content must contain `test_for_post`')

test_get_index的作用是請求首頁,并且得到正確的響應(yīng)——status code = 200洋幻,test_post_student的作用是提交數(shù)據(jù)郁轻,然后請求首頁,檢查數(shù)據(jù)是否存在鞋屈。

總結(jié)

這一部分中的三個技能點(diǎn)的使用范咨,有助于你更好的理解Django故觅,但是如果你需要更多的掌握著三個部分的內(nèi)容,需要進(jìn)一步的實(shí)踐才行渠啊。這是我們之后要做的事了输吏。不過關(guān)于測試部分,不僅僅是Django方面的只是替蛉,測試是一個單獨(dú)的話題/領(lǐng)域贯溅,有興趣的話可以找更專業(yè)的書籍來看。

小試牛刀部分就到這躲查,其中的代碼建議讀者手敲一遍它浅,在自己的Linux或者M(jìn)ac上運(yùn)行一下,改改代碼镣煮,再次運(yùn)行姐霍。別怕麻煩,也別趕進(jìn)度典唇。我經(jīng)常說镊折,所謂捷徑就是一步一個腳印,每步都能前進(jìn)/提高介衔。

下一部分開始恨胚,我們將進(jìn)入正式的開發(fā)階段,請系好安全帶炎咖,握緊鍵盤赃泡,跟上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乘盼,一起剝皮案震驚了整個濱河市升熊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绸栅,老刑警劉巖僚碎,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阴幌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卷中,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門矛双,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蟆豫,你說我怎么就攤上這事议忽。” “怎么了十减?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵栈幸,是天一觀的道長愤估。 經(jīng)常有香客問我,道長速址,這世上最難降的妖魔是什么玩焰? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮芍锚,結(jié)果婚禮上昔园,老公的妹妹穿的比我還像新娘。我一直安慰自己并炮,他們只是感情好默刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逃魄,像睡著了一般荤西。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伍俘,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天邪锌,我揣著相機(jī)與錄音,去河邊找鬼养篓。 笑死秃流,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柳弄。 我是一名探鬼主播舶胀,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碧注!你這毒婦竟也來了嚣伐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤萍丐,失蹤者是張志新(化名)和其女友劉穎轩端,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝变,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡基茵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壳影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拱层。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宴咧,靈堂內(nèi)的尸體忽然破棺而出根灯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布烙肺,位于F島的核電站纳猪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桃笙。R本人自食惡果不足惜氏堤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怎栽。 院中可真熱鬧丽猬,春花似錦、人聲如沸熏瞄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽强饮。三九已至由桌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邮丰,已是汗流浹背行您。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剪廉,地道東北人娃循。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像斗蒋,于是被迫代替她去往敵國和親捌斧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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