<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                使用 django-admin 來創建 HelloWorld 項目: ~~~ django-admin startproject HelloWorld ~~~ * **HelloWorld:**項目的容器。 * **manage.py:**一個實用的命令行工具,可讓你以各種方式與該 Django 項目進行交互。 * **HelloWorld/\_\_init\_\_.py:**一個空文件,告訴 Python 該目錄是一個 Python 包。 * **HelloWorld/asgi.py:**一個 ASGI 兼容的 Web 服務器的入口,以便運行你的項目。 * **HelloWorld/settings.py:**該 Django 項目的設置/配置。 * **HelloWorld/urls.py:**該 Django 項目的 URL 聲明; 一份由 Django 驅動的網站"目錄"。 * **HelloWorld/wsgi.py:**一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。 接下來我們進入 HelloWorld 目錄輸入以下命令,啟動服務器: ~~~ python3 manage.py runserver 0.0.0.0:8000 ~~~ 0.0.0.0 讓其它電腦可連接到開發服務器,8000 為端口號。如果不說明,那么端口號默認為 8000。 在瀏覽器輸入你服務器的 ip(這里我們輸入本機 IP 地址:**127.0.0.1:8000**) 及端口號,如果正常啟動,輸出結果如下: ## HelloWorld/HelloWorld/urls.py 文件代碼: from django.urls import path from . import views urlpatterns = \[ path('hello/', views.hello), \] 通過瀏覽器打開**http://127.0.0.1:8000/hello**,輸出結果如下: ## path() 函數 Django path() 可以接收四個參數,分別是兩個必選參數:route、view 和兩個可選參數:kwargs、name。 語法格式: ~~~ path(route, view, kwargs=None, name=None) ~~~ * route: 字符串,表示 URL 規則,與之匹配的 URL 會執行對應的第二個參數 view。 * view: 用于執行與正則表達式匹配的 URL 請求。 * kwargs: 視圖使用的字典類型的參數。 * name: 用來反向獲取 URL。 Django2. 0中可以使用 re\_path() 方法來兼容 1.x 版本中的**url()**方法,一些正則表達式的規則也可以通過 re\_path() 來實現 。 ~~~ from django.urls import include, re_path urlpatterns = [ re_path(r'^index/$', views.index, name='index'), re_path(r'^bio/(?P<username>\w+)/$', views.bio, name='bio'), re_path(r'^weblog/', include('blog.urls')), ... ] ~~~ 我們當然可以像上篇文章中的Hello World一樣,在Django的主模塊中加各種功能,但當項目變得巨大的時候,各種各樣的功能全都放在這里,就會顯得太過雜亂,缺乏邏輯性和層次性。 Django中App的作用就在于此,我們可以將不同類型的功能分成多個不同的App應用來開發,就如同手機上不同的App有不同的功能一樣,由手機系A統分別對其使用。 ### 一、App創建和配置 創建App只需要在命令行輸入命令: > python manage.py startapp loginworld 該命令沒有任何返回信息,但執行完后會在項目列表出現一個新的子app文件夾, ![](//upload-images.jianshu.io/upload_images/17476333-3d7548bff2f5a53f.png?imageMogr2/auto-orient/strip|imageView2/2/w/239/format/webp) 此時僅僅是app創建完成,還需要在setting的INSTALLD\_APPS 列表中進行配置才能正常使用該app應用 ![](//upload-images.jianshu.io/upload_images/17476333-a12d46d9ba8401a2.png?imageMogr2/auto-orient/strip|imageView2/2/w/622/format/webp) ### 二、路由設置(urls) * 路由規則 1. urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則不再繼續。 2. 當瀏覽器訪問請求的url不是以/結尾時,jango會自動給該請求加/結尾,并讓瀏覽器重新訪問.可設置為不主動加結尾處的/,方法:在settings.py文件中加入APPEND\_SLASH=False即可,配置文件中雖然沒有這個參數,但默認結果是True;當配置完成后url請求后不加/時是訪問不到頁面的。 3. URLconf匹配的位置: URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串,會取 網址之后?號之前的字符串來做正則匹配. 且匹配出來的所有東西都是字符串形式。 * 分發思路 把本該在項目目錄下的urls.py中進行路由匹配的功能給分發到各個不同的App內,在其中新建urls.py文件來進行路由匹配;在項目目錄下的urls.py中建立分發指引路徑 * 主路由 主路由或者說全局路由通過setting中的ROOT\_URLCONF確定,默認為Django文件夾下的urls, ![](//upload-images.jianshu.io/upload_images/17476333-85e368baa0d1b772.png?imageMogr2/auto-orient/strip|imageView2/2/w/475/format/webp) 我們需要在主路由中引入新建的子App的路由地址,方法如下 ![](//upload-images.jianshu.io/upload_images/17476333-8c09a712c4f40603.png?imageMogr2/auto-orient/strip|imageView2/2/w/980/format/webp) 同理推廣,我們也可以在子app上再加下級路由連到其他app或別的地方,由此設計出更復雜的多級路由 * 子路由 新建的子App默認是沒有urls的,我們需要在App目錄下新建一個urls.py文件作為子路由,在此處匹配該App對應的各種功能 在設置路由時,可以在path使用name參數為其命名,這樣就可以在views頁面和html頁面通過該名字反向獲取URL使用路由 ![](//upload-images.jianshu.io/upload_images/17476333-87c269fd07e16c75.png?imageMogr2/auto-orient/strip|imageView2/2/w/794/format/webp) * 項目中存在多個App,且App內功能有重復命名時: 比較簡單的做法是在每個App的urls頁面分別設置一個不同的`app_name`,如 ~~~bash #app1.urls.py app_name = 'app1' ~~~ ~~~bash #app2.urls.py app_name = 'app2' ~~~ 即可在views和html中準確使用路由: ~~~bash reverse('app01:hello') reverse('app02:hello') {% url 'app02:hello' %} ~~~ 如果要實現代碼的復用,或者了解app\_name和namespace的區別可以參考[https://www.jianshu.com/p/404500a0408a](https://www.jianshu.com/p/404500a0408a) ### 三、視圖(views) 簡單地說就是一個函數,接收并處理請求,調用模型和模版,響應請求 至于詳細的,不要急,慢慢來 ### 四、模型(models) Django模型涉及數據庫相關操作,此處以mysql為例 如果沒有裝mysql 驅動,可以執行以下命令安裝: > pip install mysqlclient 如果結合xampp和Navicat兩個軟件使用,可以更方便地查看數據庫信息。 * 數據庫配置 對于不同的數據庫均需要有不同的配置,但都是在setting中的DATABASES進行,mysql的配置方法如下 > DATABASES = { >   'default': { >     'ENGINE': 'django.db.backends.mysql', >    'NAME': '此處為項目名稱', >    'USER': '此處為數據庫用戶名', >    'PASSWORD': '此處為數據用戶密碼', >    'HOST':'此處為本機ip', >    'PORT':'此處為數據庫使用端口', >   } > } 在進行下面的步驟前,最好先在mysql中建立相對應的數據庫,使用上面設置的USER名字。 * 模型定義 Django規定,如果要使用模型,必須要創建一個App。 在App目錄的models中可按如下方法建表: ~~~python # models.py from django.db import models class Test(models.Model): user = models.CharField(max_length=20) password = models.CharField(max_length=200) class Meta: #表在mysql中的名字 db_table = 'Test' ~~~ * 數據庫建表 在命令行執行下面兩條命令,可在數據庫建表,數據庫存儲時還會默認存儲一項自增的id屬性。這兩條命令前者是將model層轉為遷移文件migration,后者將新版本的遷移文件執行,更新數據庫。 > python manage.py makemigrations > python manage.py migrate 默認情況下這兩個命令作用于全局,如果想僅僅對部分app進行作用的話 則執行如下命令: > python manage.py makemigrations appname > python manage.py migrate appname 如果要想精確到某一個遷移文件則可以使用: > python manage.py makemigrations appname filename > python manage.py migrate appname filename * 增刪改查 想要對數據庫中已經建立的表進行任何操作,均需要引用models中的模型,如在同一App下可用“.”表示同級目錄 > from .models import Test 增刪改查的任何操作均有Django已經封裝好的函數來實現,這里大致記錄一下,詳細的以后另寫 * 增 > test1 = Test(user='root',password='123456') > test1.save() * 刪 刪除id=1的數據 > test1 = Test.objects.get(id=1) > test1.delete() 另外一種方式 > Test.objects.filter(id=1).delete() 刪除所有數據 > Test.objects.all().delete() * 改 修改其中一個id=1的name字段,再save,相當于SQL中的UPDATE > test1 = Test.objects.get(id=1) > test1.user= 'Google' > test1.save() 另外一種方式 > Test.objects.filter(id=1).update(user='Google') 修改所有的列 > Test.objects.all().update(user='Google') * 查 通過objects這個模型管理器的all()獲得所有數據行,相當于SQL中的SELECT \* FROM > list = Test.objects.all() filter相當于SQL中的WHERE,可設置條件過濾結果 > response2 = Test.objects.filter(id=1) 獲取單個對象 > response3 = Test.objects.get(id=1) ### 五、模板文件(html) Django中的模版文件雖然還是.html,但本質上是html代碼+邏輯控制代碼組成,Django提供了一些標簽、過濾器和語法等用于在html中進行控制,這里的html模板是一個文本,用于分離文檔的表現形式和內容 需要注意的是,Django項目的所有模版文件即html都必須放在templates目錄下,其在setting中默認配置如下 ![](//upload-images.jianshu.io/upload_images/17476333-1557e3e3635afb81.png?imageMogr2/auto-orient/strip|imageView2/2/w/1099/format/webp) 如果在Django項目根目錄的templates中和各個app中分別創建index.html,默認訪問根目錄templates中的index.html文件,如果templates中不存在,則按照settings.py中App的設置順序進行加載。 ### 六、靜態文件 在網頁中,除了html外,需要的各種css樣式文件,js執行文件以及一些圖片、聲音、視頻等,都是需要加載的動態文件。在Django中,使用static標簽來加載靜態文件。要使用static標簽,首先需要{% load static %},之后只需要引用文件相對static文件夾的路徑即可。 * setting設置 下述兩條設置在創建Django 項目的時候就已經自動設置好了,只要不修改就沒問題。 * 將“django.contrib.staticfiles”添加到INSTALLED\_APPS中; * 設置STATIC\_URL = '/static/' * 文件夾創建 無論在哪創建,文件夾名字都必須為static * 在app下創建一個static文件夾,在這個static文件夾下創建一個當前app的名字的文件夾,再把靜態文件放到這個文件夾下。 這樣做的原因是,如果直接把靜態文件放在static文件夾下,那么在模版加載靜態文件的時候就是使用**文件名**,如果在多個app之間有同名的靜態文件,這時候可能就會產生混淆。而在static文件夾下加了一個同名app文件夾,在模版中加載的時候就是使用**app名/文件名**,這樣可以避免混淆。 * 如果有一些靜態文件不和任何app掛鉤。即不在任何一個app目錄下。那么可以在settings.py中的STATIC\_URL 后面位置添加STATICFILES\_DIRS,以后DTL就會在這個列表的路徑中查找靜態文件。例如我們在項目的根目錄下新建一個static文件夾,則路徑應該如下: ~~~csharp STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static") ] #或者 STATIC_ROOT = os.path.join(BASE_DIR, 'static') ~~~ * 引用方法 在模版中使用load標簽加載static標簽。比如要加載在項目的static文件夾下的style.css的文件。那么示例代碼如下: ~~~cpp {% load static %} <link rel="stylesheet" href="{% static 'style.css' %}"> ~~~ 要注意的是,{% load static %}需要放在html的頭部位置(至少在使用static標簽的上面),一般都是放在html的最上面。如果{% extend %}標簽和{% load static %}同時存在,{% extend %}需要放在最上面,然后再放{% load static %}等標簽。 * 偷懶方法 可以在settings中的TEMPLATES/OPTIONS添加'builtins':\['django.templatetags.static'\],這樣以后就可以在模版中直接使用static標簽,而不用手動load。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看