成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

兩篇文章幫你入門Django(上)

shuibo / 1774人閱讀

摘要:本文結(jié)合官方文檔中的個(gè)小教程,幫你了解。一共分上下兩篇文章,上篇主要來分析處理的機(jī)制,下篇來介紹下提供的后臺(tái)管理,以及單元測(cè)試等強(qiáng)大的功能。項(xiàng)目創(chuàng)建成功之后,可以運(yùn)行生成相應(yīng)的數(shù)據(jù)庫(kù)表是引入的命令,較早的版本可以用其他的命令代替。

原文地址

相信用過python的人都聽過Django的大名,知道它是一個(gè)web框架,用來支持動(dòng)態(tài)網(wǎng)站、網(wǎng)絡(luò)應(yīng)用程序以及網(wǎng)絡(luò)服務(wù)的開發(fā)。那么為什么我們需要一個(gè)web框架,而不是直接用python來寫web應(yīng)用呢?其實(shí)簡(jiǎn)單來說,就是為了偷懶。

如果不用框架的話,你可能需要連接數(shù)據(jù)庫(kù)、查詢數(shù)據(jù)庫(kù)、關(guān)閉數(shù)據(jù)庫(kù),在python代碼文件里摻雜html標(biāo)簽、css樣式等。并且每次開始一個(gè)web應(yīng)用,你都要從頭開始寫起,重復(fù)許多枯燥無味的代碼。

而web框架提供了通用web開發(fā)模式的高度抽象,使我們可以專注于編寫清晰、易維護(hù)的代碼。Django作為python下的web框架,從誕生到現(xiàn)在有著數(shù)以萬計(jì)的用戶和貢獻(xiàn)者,有著豐富的文檔,活躍的社區(qū),是web開發(fā)很好的選擇。

本文結(jié)合 Django 官方文檔 First steps 中的6個(gè)小教程,幫你了解Django。一共分上、下兩篇文章,上篇主要來分析Django處理Http Request的機(jī)制,下篇來介紹下Django提供的后臺(tái)管理,以及單元測(cè)試等強(qiáng)大的功能。

Django 工作流程

在開始具體的代碼之旅前,先來宏觀地看下Django是如何處理Http Resquest的,如下圖:

假設(shè)你已經(jīng)在瀏覽器輸入了 http://127.0.0.1:8000/polls/,接下來瀏覽器會(huì)把請(qǐng)求交給Django處理。根據(jù)上圖,我們知道Django需要根據(jù)url來決定交給誰(shuí)來處理請(qǐng)求,那么Django是如何完成這項(xiàng)工作呢?很簡(jiǎn)單,Django要求程序員提供urls.py文件,并且在該類文件中指定請(qǐng)求鏈接與處理函數(shù)之間的一一對(duì)應(yīng)關(guān)系。

這里請(qǐng)求鏈接是以正則表達(dá)式的方式指定,并且不用指定域名,比如說要精確匹配上面的例子, 只需要指定正則表達(dá)式為 ^polls/$ 即可。要匹配 http://|5e46bd7270c4c5723394282dcc9f64f66|(這里polls后面只要是數(shù)字即可),那么只需要 ^polls/d+/$ 即可。回到上面的例子,Django中只需要在urls.py添加以下語(yǔ)句即可。

urlpatterns = patterns(
    "",
    url(r"^polls/$", views.index),
)

這樣當(dāng)請(qǐng)求鏈接為http://127.0.0.1:8000/polls/時(shí),就會(huì)用views.py中的函數(shù)index()來處理請(qǐng)求?,F(xiàn)在Django知道由index來處理請(qǐng)求了,那么index需要做哪些工作呢?

它需要加載返回內(nèi)容的模板,這里比如說是index.html

def index(request):
    template = loader.get_template("polls/index.html")

模板文件就是返回頁(yè)面的一個(gè)骨架,我們可以在模板中指定需要的靜態(tài)文件,也可以在模板中使用一些參數(shù)和簡(jiǎn)單的邏輯語(yǔ)句,這樣就可以將其變?yōu)橛脩糇罱K看到的豐滿的頁(yè)面了。

要使用靜態(tài)文件,比如說css、javascript等,只需要用{% load staticfiles %}來聲明一下,然后直接引用即可,比如說:


參數(shù)和邏輯語(yǔ)句也很簡(jiǎn)單,比如說以下語(yǔ)句:

{% for question in latest_question_list %}
    
  • {{ question.question_text }}
  • {% endfor %}

    用for循環(huán)遍歷latest_question_list,逐個(gè)輸出內(nèi)容question_text。這里我們用到了參數(shù)latest_question_list,它的值其實(shí)是在views.py中計(jì)算出來給模板文件的,我們這里假設(shè)是從數(shù)據(jù)庫(kù)中取出最新的5個(gè)question,如下:

    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    

    這里用到了數(shù)據(jù)庫(kù),其實(shí)Django給我們封裝了數(shù)據(jù)庫(kù)的讀寫操作,我們不需要用SQL語(yǔ)句去查詢、更新數(shù)據(jù)庫(kù)等,我們要做的是用python的方式定義數(shù)據(jù)庫(kù)結(jié)構(gòu)(在model.py里面定義數(shù)據(jù)庫(kù)),然后用python的方式去讀寫內(nèi)容。至于連接數(shù)據(jù)庫(kù)、關(guān)閉數(shù)據(jù)庫(kù)這些工作交給Django去替你完成吧。上面例子中,Question數(shù)據(jù)庫(kù)結(jié)構(gòu)的定義如下:

    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField("date published")
    
        def __str__(self):
            return self.question_text
    

    好了,現(xiàn)在有了模板文件這個(gè)骨架,又有參數(shù)、邏輯語(yǔ)句、靜態(tài)文件等血肉,一個(gè)豐滿的頁(yè)面就誕生了,來看一下完整的index函數(shù)吧:

    def index(request):
        latest_question_list = Question.objects.order_by("-pub_date")[:5]
        template = loader.get_template("polls/index.html")
        context = RequestContext(request, {
            "latest_question_list": latest_question_list,
        })
        return HttpResponse(template.render(context))
    
    第一個(gè)Django項(xiàng)目

    前面為了使大家了解Django處理HTTP Request的過程,我們簡(jiǎn)化了一些內(nèi)容,下面我們將盡量還原Django真實(shí)的面貌。在開始具體的技術(shù)細(xì)節(jié)前,我們先來搞清楚Django中projects和apps的區(qū)別。App是專注于做某件事的web應(yīng)用,比如說一個(gè)用戶認(rèn)證系統(tǒng),或者是公開投票系統(tǒng);而project則是一個(gè)web站點(diǎn),可能包括許多app和一些配置。一個(gè)project可以包含許多app,一個(gè)app可以用于許多project中。

    使用Django時(shí)一般會(huì)先創(chuàng)建一個(gè)project,比如說是mysite,如下:

    $ django-admin.py startproject mysite
    $ tree -L 2 mysite
    mysite
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    1 directory, 5 files
    

    然后我們可以在 mysite/settings.py 中進(jìn)行項(xiàng)目的一些配置,比如配置時(shí)區(qū),數(shù)據(jù)庫(kù)連接的相關(guān)信息,或者是應(yīng)用的添加、刪除等。這里需要特別注意的是數(shù)據(jù)庫(kù)設(shè)置,Django支持sqlite、mysql、oracle等數(shù)據(jù)庫(kù),使用前必須安裝、啟動(dòng)相應(yīng)的數(shù)據(jù)庫(kù),并建立相應(yīng)的賬戶。這里為了簡(jiǎn)單,我們使用python內(nèi)置的sqlite,settings里面的數(shù)據(jù)庫(kù)配置不需要更改即可。

    項(xiàng)目創(chuàng)建成功之后,可以運(yùn)行

    $ python manage.py migrate
    

    生成相應(yīng)的數(shù)據(jù)庫(kù)表(migrate是Django 1.7引入的命令,較早的版本可以用其他的命令代替)。為什么新建的空項(xiàng)目里就會(huì)有數(shù)據(jù)庫(kù)表呢?這是因?yàn)槟J(rèn)情況下,項(xiàng)目配置文件settings.py里面已經(jīng)配置有Django自帶的應(yīng)用,如下:

    INSTALLED_APPS = (
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.sessions",
        "django.contrib.messages",
        "django.contrib.staticfiles",
    )
    

    這些應(yīng)用需要和數(shù)據(jù)庫(kù)交互。(通常情況下默認(rèn)的應(yīng)用很有用,不過你可以根據(jù)需求刪減)

    到這里為止,我們的Django項(xiàng)目已經(jīng)可以運(yùn)行了,用下面簡(jiǎn)單的命令開啟Django自帶的開發(fā)環(huán)境web服務(wù)

    $ python manage.py runserver
    

    接下來,試試在瀏覽器打開 http://127.0.0.1:8000/,看看Django的 It worked! 頁(yè)面吧。

    現(xiàn)在我們的項(xiàng)目初具雛形,并且運(yùn)行良好,這是個(gè)好的開端,不過我們可以讓它變的更加實(shí)用,就讓她完成以下任務(wù)吧:

    在一個(gè)問答系統(tǒng)中添加問題;

    顯示所有已經(jīng)添加的問題。

    聽起來很簡(jiǎn)單,不是嗎?不過這個(gè)任務(wù)已經(jīng)涉及到向后臺(tái)寫數(shù)據(jù),從后臺(tái)讀取數(shù)據(jù),作為一個(gè)例子而言,足夠用了。就讓我們新建一個(gè)名為questions的app來完成這項(xiàng)任務(wù)吧:

    $ python manage.py startapp questions
    

    首先我們得設(shè)計(jì)好數(shù)據(jù)庫(kù)字段,用來存儲(chǔ)問題。上面的任務(wù)設(shè)計(jì)起來很簡(jiǎn)單,只需要建立一個(gè)名為Question的表格,然后里面有context字段。Django提供了models來方便我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù),因此我們的questions/models.py看起來可能是這樣的:

    from django.db import models
    
    class Question(models.Model):
        context = models.CharField(max_length=200)
    

    現(xiàn)在將questions應(yīng)用添加進(jìn)項(xiàng)目的配置文件mysite/settings中:

    INSTALLED_APPS = (
        "django.contrib.admin",
        ...,
        "questions",
    )
    

    然后通過以下命令來生成Question數(shù)據(jù)庫(kù)表格:

    $ python manage.py makemigrations questions
    $ python manage.py migrate
    

    接下來設(shè)計(jì)三個(gè)URL地址add/, add_done/, index/(這里的地址并不包含域名) 分別用來展示填寫問題頁(yè)面,添加成功后頁(yè)面,顯示所有問題頁(yè)面。然后在mysite/urls.py中指定相應(yīng)的處理函數(shù),如下:

    from django.conf.urls import patterns, include, url
    from questions import views
    
    urlpatterns = patterns(
        "",
        url(r"^add/$", views.add),
        url(r"^index/$", views.index),
        url(r"^add_done/$", views.add_done),
    )
    

    當(dāng)然了,我們需要在questions/views.py中實(shí)現(xiàn) index, add 和 add_done:

    index: 獲取當(dāng)前所有問題,傳給模板文件,返回Response;

    add: 直接返回添加問題表單頁(yè)面即可;

    add_done: 獲取POST得到的問題,將其添加到數(shù)據(jù)庫(kù),返回Response;

    代碼如下:

    def index(request):
        question_list = Question.objects.all()
    
        return render(
            request,
            "questions/index.html",
            {"question_list": question_list},
        )
    
    
    def add_done(request):
        add_question = Question()
        content = request.POST["content"]
        add_question.context = content
        add_question.save()
        return render(
            request,
            "questions/add_done.html",
            {"question": content},
        )
    
    
    def add(request):
        return render(request, "questions/add.html")
    

    這里render函數(shù)加載模板,并且以字典的形式傳遞參數(shù),返回Response頁(yè)面。模板文件內(nèi)容不在這里給出,運(yùn)行結(jié)果截圖如下:



    如果你讀到這里,那么應(yīng)該會(huì)知道Django處理Http Request的過程,并且能動(dòng)手寫一個(gè)簡(jiǎn)單的Django小項(xiàng)目了。不過Django作為一個(gè)優(yōu)秀的Web框架,還提供了諸如后臺(tái)管理,單元測(cè)試等強(qiáng)大的功能,我們會(huì)在下一篇文章來共同學(xué)習(xí)。

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45311.html

    相關(guān)文章

    • 文章幫你入門Django(下)

      摘要:原文地址在兩篇文章幫你入門上一文中,我們已經(jīng)做了一個(gè)簡(jiǎn)單的小網(wǎng)站,實(shí)現(xiàn)了保存用戶數(shù)據(jù)到數(shù)據(jù)庫(kù),以及從后臺(tái)數(shù)據(jù)庫(kù)讀取數(shù)據(jù)顯示到網(wǎng)頁(yè)上這兩個(gè)功能。注意測(cè)試時(shí)并不需要運(yùn)行服務(wù),這樣能節(jié)省服務(wù)的開銷,提高測(cè)試的速度。 原文地址 在兩篇文章幫你入門Django(上)一文中,我們已經(jīng)做了一個(gè)簡(jiǎn)單的小網(wǎng)站,實(shí)現(xiàn)了保存用戶數(shù)據(jù)到數(shù)據(jù)庫(kù),以及從后臺(tái)數(shù)據(jù)庫(kù)讀取數(shù)據(jù)顯示到網(wǎng)頁(yè)上這兩個(gè)功能。 看上去沒有什么問...

      voidking 評(píng)論0 收藏0
    • Django搭建個(gè)人博客:日志記錄

      摘要:每一條日志記錄也包含級(jí)別,代表對(duì)應(yīng)消息的嚴(yán)重程度。即格式化器,主要功能是確定最終輸出的形式和內(nèi)容。最好是日志能夠按自然天進(jìn)行記錄和分割。 上一章學(xué)習(xí)了自動(dòng)化測(cè)試,很好,現(xiàn)在我們可以絞盡腦汁寫出一份全面的測(cè)試,來保證代碼永遠(yuǎn)健康了。 話雖如此,但是作為一個(gè)獨(dú)立開發(fā)者很難寫出真正全面的測(cè)試代碼。這是因?yàn)橛脩粼谑褂媚愕木W(wǎng)站時(shí)可不會(huì)循規(guī)蹈矩,而是會(huì)以各種怪異的姿勢(shì)瀏覽網(wǎng)頁(yè)、上傳數(shù)據(jù)。但這也不是...

      Lowky 評(píng)論0 收藏0
    • Python

      摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語(yǔ)言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫(kù)為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...

      dailybird 評(píng)論0 收藏0
    • Python學(xué)習(xí)之路17-Django入門

      摘要:編程從入門到實(shí)踐筆記。執(zhí)行命令后,項(xiàng)目的根目錄下會(huì)多出一個(gè)名為的數(shù)據(jù)庫(kù)文件。下面創(chuàng)建一個(gè)主題類用戶學(xué)習(xí)的主題返回模型的字符串表示類是中的一個(gè)定義了模型基本功能的類。這種交互式環(huán)境稱為,常用語(yǔ)測(cè)試項(xiàng)目和排除故障。 《Python編程:從入門到實(shí)踐》筆記。從本篇開始將是該書的最后一個(gè)項(xiàng)目,將用3篇文章來介紹Django的基礎(chǔ)。完成一個(gè)學(xué)習(xí)筆記的小網(wǎng)站。 1. 前言 在本篇中,我們將: 用...

      shadowbook 評(píng)論0 收藏0
    • Python - 收藏集 - 掘金

      摘要:首發(fā)于我的博客線程池進(jìn)程池網(wǎng)絡(luò)編程之同步異步阻塞非阻塞后端掘金本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)先與作者聯(lián)系。在了解的數(shù)據(jù)結(jié)構(gòu)時(shí),容器可迭代對(duì)象迭代器使用進(jìn)行并發(fā)編程篇二掘金我們今天繼續(xù)深入學(xué)習(xí)。 Python 算法實(shí)戰(zhàn)系列之棧 - 后端 - 掘金原文出處: 安生??? 棧(stack)又稱之為堆棧是一個(gè)特殊的有序表,其插入和刪除操作都在棧頂進(jìn)行操作,并且按照先進(jìn)后出,后進(jìn)先出的規(guī)則進(jìn)行運(yùn)作。 如...

      546669204 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <