• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • python web 開發 - Django 入門

    標簽: python  django  mysql  

    開篇

    通過上一篇 python 入門實戰 - 學生管理系統 練習了一把 python 語法。本篇總結下 Django 這個 web 框架的入門使用。前提是要有相關的 web 開發經驗(Java, php等)。因為本文不會涉及 http 協議,前后端分離不分離等概念。

    另附:

    1. 官方教程: https://docs.djangoproject.com/en/3.0/intro/tutorial02/
    2. 菜鳥教程: https://www.runoob.com/django/django-tutorial.html

    正文

    本人開發環境

    • 操作系統: MacOS
    • IDE: vscode
    • 數據庫: mysql
    • python 版本 3.x

    準備工作

    1. 安裝 django (非 maOS 操作系統 請參考開篇的教程選擇安裝方式,以及驗證是否安裝成功)

       python3 -m pip install django==1.11.6
      
    2. 創建項目

       django-admin startproject helloworld(這個是項目名)
      

    圖中標記了 4 個地方
    1. 創建完 helloworld 項目后,會發現helloworld 下面還有一個 helloworld, 后面說到的 helloworld 一般都是第一層級,簡稱項目根目錄
    2. settings.py 主要是一些配置,比如數據庫,靜態文件存放位置等
    3. urls.py 主要配置 url 和 函數的映射關系
    4. manage.py 提供用來管理項目的命令,比如啟動項目,后面請多留意
    
    1. 進入項目根目錄

      cd helloworld
      
    2. 啟動項目,并訪問

    (這里會啟動失敗,原因是 python3 和 django 的兼容問題,反正我用的 django 版本存在這個問題,解決方式就是刪除某個文件的一個 逗號,如果遇見了,百度一搜就明白了,具體內容當初忘記保存了)

        python3 manage.py runserver
        // 當然也可以指定ip:host
        python3 manage.py runserver localhost:8080
    

    1. 至此一個 web 項目雛形已經有了

    繼續完善

    至此我們就可以自行開發 web 應用了,但是你也許還會問

    1. http 請求調用的函數寫在哪里,以及函數 和 頁面的映射關系如何體現
    2. 靜態文件的存放位置

    下面就新建的 helloword 項目進行講解

    問題 1. 函數及其映射關系

    找到 helloworld/helloworld/ 下面有個 urls.py 文件

    默認配置:

        from django.conf.urls import url
        from django.contrib import admin
       
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
        ]
    

    修改后:

        from django.conf.urls import url
    
        from django.contrib import admin
    
        # 下面是新增的
        from django.shortcuts import HttpResponse, render, redirect
    
        # 1. 跳轉頁面
        # render 表示 訪問 http://localhost:8000/index 會跳轉到 index.html 頁面
        def index(request):
            return render(request, 'index.html')
    
        # 2. 跳轉頁面,并攜帶參數
        def index02(request):
            return render(request, 'index.html', {'參數名', 值})
            
        # 3. 重定向
        def index03(request):
            return redirect('/index/')
            
        # 4. 接收參數
        def index04(request):
            # 接收 post 請求參數
            request.POST.get('參數名')
            # 接收 get 請求參數
            request.GET.get('參數名')
            return render(request, 'index.html')     
        
        # 配置 url 映射
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
            # 配置 url 映射
            # 訪問 http://localhost:8000/index/ 就會調用上面的 index 函數
            url(r'^index/', index), 
            
            # TODO 省略 index02, index03, index 04 映射配置
        ]
    
    1. 靜態文件存放位置

    找到 helloworld/helloworld/ 下面有個 settings.py 文件

    html 文件配置: 大概 50 多行的位置

    TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         
        # 修改這個配置項如下
        # 然后在項目根目錄下,新建 templates 目錄,用于存放 html 文件
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        
        'APP_DIRS': True,
        'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    css,js ,image 文件配置: 在 settings.py 文件末尾

    STATIC_URL = '/static/'  # 在 項目根目錄 helloworld 下面
    
    # 當然還有別名的用法,剛開始學,多說無益
    

    如何在 html 中引用 css,js

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <script src='/static/test.js'></script>
        <title>Document</title>
    </head>
    <body>
    
    </body>
    </html>
    

    規范項目

    上面有些寫法多為練習使用,因此不太規范。比如我們在 helloword/helloword/urls.py 寫了一大堆函數,非常不雅觀。所以現在引入一個新的東西。

    1. 在項目根目錄下,執行

       python3 manage.py startapp app(模塊名)
       
       # 這是我們第二次使用  manage.py 這個文件,
       # 第一次是啟動項目,現在應該可以理解 這個文件是干嘛用的
       # 執行結束,我們會發現項目根目錄下多了一個 app 目錄
      

    1. 讓 django 知道你新增的 app 模塊

        INSTALLED_APPS = [
               'django.contrib.admin',
               'django.contrib.auth',
               'django.contrib.contenttypes',
               'django.contrib.sessions',
               'django.contrib.messages',
               'django.contrib.staticfiles',
       		# 新增 
               'app.apps.AppConfig'  # 也可以直接寫 'app'
       		# app 就是新增的目錄名 后面的 固定,
       		# 你也可以打開  app/apps.py 文件,看看
           ]
      
    2. app 目錄下 有個 views.py 文件,我們可以把函數定義在這里。

       from django.shortcuts import HttpResponse, render, redirect
      
       def index(request):
       
           return render(request, 'index.html')
      
    3. 然后回到 helloword/helloword/urls.py 文件中,修改后如下:

       # 1. 導入函數
       from app.views import index
       
       # 2. 配置
       urlpatterns = [
           url(r'^admin/', admin.site.urls),
           url(r'^index/', index),
       ]
      

    附加

    如何配置 mysql 數據庫

    同樣找到 helloworld/helloworld/ 下面有個 settings.py 文件,大概 70-80行左右

    修改后如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'student_sys', # 庫
            'USER': 'root',
            'PASSWORD': '123456',
            'HOST': 'localhost',
            'PORT': 3306
        }
    }
    

    然后找到 helloworld/app/init.py 文件

    文件默認是空的, 添加如下配置

    import pymysql
    
    # 告訴 django 用 pymysql 代替 mysqldb
    pymysql.install_as_MySQLdb()
    

    引入 orm

    進入 helloworld/app/ 目錄找到 models.py 文件,修改如下:

    from django.db import models
    
    # 定義一個 Student 類
    class Student(models.Model):
        id = models.AutoField(primary_key=True) # 主鍵
        name = models.CharField(max_length=20) # 字符類型
        sex = models.CharField(max_length=2)
        birthday = models.CharField(max_length=10)
    
        
        def __str__(self):
            return self.name + "\t" + self.sex + "\t" + self.birthday
    

    在項目根目錄 helloworld 下依次執行

    python3 manage.py makemigrations
    
    python3 manage.py migrate
    

    會自動幫我們生成表

    也許你還會困惑:

    1. 為什么就定義了一個 model,生成了那么多表
    2. 修改 model 后,怎么自動更新表結構
    3. 如何 crud 等等

    ~~~~~ 請自行探索

    總結

    自我吐槽: 其實這樣的教程很雞肋,擔心篇幅過長看的人眼花繚亂。

    • 很多地方沒有給出解釋,比如 settings.py 的一些配置,自動生成表等
    • 遺留了很多問題沒有給出答案,甚至有些問題都沒在文中提到,比如,訪問頁面會出現 403,該如何解決
    • 之所以沒講那么多,是覺得那些問題很容解決

    寫完之后,感覺本文的定位更多的是自我總結,可能你們看到這文章會吐槽,噴我~~~

    版權聲明:本文為cnm10050原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/cnm10050/article/details/104137179

    智能推薦

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    精品国产乱码久久久久久蜜桃不卡