django入門講解

在咱們的認知中python被稱做調包俠,你知道這個嘛,就是由於在python中基本全部的事情均可以調用第三方寫好的模塊。html

軟件開發架構

首先說一下軟件開發架構:前端

c/s 客戶端 服務端python

b/s 瀏覽器端 服務端mysql

ps:b/s本質上也是c/sjquery

http協議

http是超文本傳輸協議web

  1. http有四大特性:
    • 基於TCP/IP之上做用於應用層。
    • 基於請求響應
    • 無狀態: 不保存狀態,就是不保存記錄,能夠屢次訪問,一直訪問,(cookie,session,token)
    • 無鏈接:請求一次響應一次,而後斷開(若是使用長鏈接,使用websocket(HTTP協議的大補丁))
  2. 數據格式
    1. 數據格式之請求格式
      • 請求首行(請求方式,協議版本。。。)
      • 請求頭(一大堆k:v鍵值對)
      • \r\n(空行,或者說換行)
      • 請求體:向服務器發送post請求的時候,請求體纔會有數據,若是是get請求是沒有請求體的。
    2. 數據格式之響應格式
      • 響應首行
      • 響應頭
      • \r\n
      • 響應體
  3. 請求方式
    • get請求:向一方(服務器)要數據。
    • post請求:向一方(服務器)提交數據(eg>用戶登錄)
  4. 響應狀態碼
    • 1xx 服務端已經接收到 你發送的數據,正在處理,你能夠繼續提交數據,informational(信息狀態碼),接收的請求正在處理。
  • 2xx 請求成功。sunccess(成功狀態碼)請求正常處理完畢sql

    • 3xx 重定向,redirection(重定向狀態碼),須要進行附加操做完成請求
  • 4xx 請求錯誤(404:請求資源不存在,403:拒絕訪問),client Error(客戶端錯誤狀態碼),服務器沒法處理請求數據庫

    • 5xx 服務器內部錯誤(500) server error(服務器錯誤狀態碼),服務器處理請求出錯。
  1. url:統一資源定位符

手擼web框架

  1. 手動書寫socket
  2. 手動處理http格式數據
#Author:SkyOcean
# @Time     :2019/10/1821:31
# @Author   :SkyOcean
# @Site     :
# @File     :手擼.py
# @Software :PyCharm
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
    conn,add = server.accept()
    data = conn.recv(1024)
    # print(data)
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    data=data.decode("utf-8")
    current_path = data.split("\r\n")[0].split(' ')[1]
    if current_path=='/index':
        conn.send(b'index')
    elif current_path=='/login':
        conn.send(b'login')
    else:
        conn.send(b'404 errror')

基於wsgiref模塊

該模塊實現了上面倆個手動的過程django

from wsgiref.simple_server import make_server
from urls import urls
from views import *




def run(env,response):
    """
    :param env: 請求相關的全部數據
    :param response: 響應相關的全部數據
    :return:
    """
    response('200 OK',[])
    # print(env)
    current_path = env.get('PATH_INFO')
    # if current_path == '/index':
    #     # 不少業務邏輯代碼
    #     return [b'index']
    # elif current_path == '/login':
    #     return [b'login']
    # else:
    #     return [b'404 error']
    # 先定義一個變量名 用來存儲後續匹配到的函數名
    func = None
    # for循環 匹配後綴
    for url in urls:
        if current_path == url[0]:
            func = url[1]  # 一旦匹配成功 就將匹配到的函數名賦值給func變量
            break  # 主動結束匹配
    # 判斷func是否有值
    if func:
        res = func(env)
    else:
        res = error(env)
    return [res.encode('utf-8')]




if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)
    # 實時監聽該地址  只要有客戶端來鏈接 統一交給run函數去處理
    server.serve_forever()  # 啓動服務端

根據功能不一樣拆分紅了不一樣的py文件

  1. urls.py 路由與視圖函數對象關係

    from views import *
    
    urls = [
        ('/index',index),
        ('/login',login),
        ('/xxx',xxx),
        ('/get_time',get_time),
        ('/get_user',get_user),
        ('/get_db',get_db),
    ]
  2. views.py 放的是視圖函數(函數,類)(處理業務邏輯的)

    def index(env):
        return 'index'
    
    
    def login(env):
        return 'login'
    
    def error(env):
        return '404 error'
    
    
    def xxx(env):
        return 'xxx'
    
    from datetime import datetime
    
    
    def get_time(env):
        current_time = datetime.now().strftime('%Y-%m-%d %X')
        with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_time.html','r',encoding='utf-8') as f:
            data = f.read()
        data = data.replace('$$time$$',current_time)
        return data
    
    from jinja2 import Template
    
    def get_user(env):
        d = {'name':'jason','pwd':'123','hobby':['read','running','music']}
        with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_user.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(user=d)  # 將字典d傳遞給前端頁面 頁面上經過變量名user就可以獲取到該字典
        return res
    
    import pymysql
    
    def get_db(env):
        conn = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            user = 'root',
            password = 'root',
            database = 'day56',
            charset = 'utf8',
            autocommit = True
        )
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "select * from userinfo"
        cursor.execute(sql)
        res = cursor.fetchall()
        print(res)
        with open(r'D:\上海Python11期視頻\python11期視頻\day56\templates\get_db.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)
        ret = temp.render(user_list = res)  # 將字典d傳遞給前端頁面 頁面上經過變量名user就可以獲取到該字典
        return ret
  3. templates 模板文件夾(用來存放一堆html文件)

    <!--get_time.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <titget_timele>Title</titget_timele>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    $$time$$
    </body>
    </html>
    <!--get_user.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <p>{{ user }}</p>
    <p>{{ user.name }}</p>
    <p>{{ user['pwd'] }}</p>
    <p>{{ user.get('hobby') }}</p>
    </body>
    </html>
    <!--get_db.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h1 class="text-center">用戶列表</h1>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                        <tr>
                            <th>id</th>
                            <th>name</th>
                            <th>pwd</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for user_dict in user_list %}
                            <tr>
                                <td>{{ user_dict.id }}</td>
                                <td>{{ user_dict.name }}</td>
                                <td>{{ user_dict.pwd }}</td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    
    </div>
    </body>
    </html>

拆分完成後,添加功能只須要在urls.py和views.py方面修改就行

動靜態網頁

  1. 靜態網頁

    數據是寫死的 萬年不變

  2. 動態網頁
    數據是實時獲取的
    eg:
    1.後端獲取當前時間展現到前端
    2.後端獲取數據庫中的數據展現到前端

疑問:
如何將後端獲取的數據 傳遞給html頁面

後端獲取的數據 傳遞給html頁面  >>>:  模板的渲染

jinja2  
pip3 install jinja2

在前端字典的使用

模板語法(極其貼近pythaon後端語法)
    <p>{{ user }}</p>
    <p>{{ user.name }}</p>
    <p>{{ user['pwd'] }}</p>
    <p>{{ user.get('hobby') }}</p>

在前端數據庫的使用

模板語法(極其貼近pythaon後端語法)
{% for user_dict in user_list %}
        <tr>
            <td>{{ user_dict.id }}</td>
            <td>{{ user_dict.name }}</td>
            <td>{{ user_dict.pwd }}</td>
        </tr>
    {% endfor %}

python三大主流web框架

  1. Django:
    • 大而全,自身的功能特別多,相似航空母艦
    • 有時候過於笨重
  2. Flask
    • 小而精 自帶的功能特別特別少,相似遊騎兵
    • 支持的第三方的模塊特別多,若是將flask第三方模塊所有加起來,徹底能夠操過django
    • 過於依賴第三方模塊,當第三方的模塊不能使用的時候(源碼再也不開放,存在bug做者不修改,做者再也不維護等),flask就會癱瘓。
  3. Tornado
    • 異步非阻塞
    • 特別厲害,牛逼到能夠開發遊戲服務器

他們涉及到三個領域

A:socket部分

B:路由和視圖函數對應關係

C:模板語言

Django:

​ A:用別人的 wsgiref模塊

​ B: 本身寫的

​ C:本身寫的

Flask:

​ A:用別人寫的 werkzeug模塊(基於wsgiref模塊)

​ B:本身寫的

​ C:用別人的 jinja2

Tornado

​ 三個都是本身寫的

Django的使用

注意事項

  1. 計算機中的名稱中不能有中文
  2. 一個pycharm窗口就是一個項目
  3. 項目名稱裏面儘可能不要中文

django版本的問題

1.X 版本 2.X版本 如今市面上用的比較多的仍是1.X

推薦你使用1.11.9~1.11.13

下表中LTS 表示還在維護的版本

Django安裝

直接安裝最新版本:pip3 install django

選擇版本:pip3 install django==1.11.11

驗證django是否安裝成功:

​ 命令行輸入diango-admin

app

一個django項目就相似因而一所大學,而app就相似於大學裏面的學院

django其實就是用來一個個應用的

一個app就至關於一塊獨立的功能,好比:用戶功能 管理功能

django支持任意多個app

如何使用django

命令行使用

  1. 首先切換到要建立的文件下,而後建立django項目:django-admin startproject 項目名,如django-admin startproject mysite

  2. 啓動django項目:python manage.py runserver IP和端口號,如:python manage.py runserver 127.0.0.1:8080,不輸入ip和端口號默認開啓本機,如python manage.py runserver

  3. 建立應用app:python manage.py startapp app名,如python manage.py startapp app01

    1. 注意:

      • 新建立的app須要你去settings配置文件中進行註冊,若是是pycharm只會幫助你註冊第一個在你建立項目的時候寫的應用,建立第二的app 的時候須要本身進行配置。

  4. 注意:

    1. 使用命令行建立d'jango項目的時候,不會自動幫助你建立templates文件夾。只能本身手動建立。
    2. settings文件中,須要你手動在TEMPLATES中寫配置文件:os.path.join(BASE_DIR,'templates')

  5. 命令行關閉直接退出

pycharm使用

建立django項目

在啓動django項目的時候 你必定要確保一個端口只有一個django項目

目錄介紹

項目名(mysite)
    (mysite)跟項目名同名的文件夾:項目目錄
        __init__.py
        settings.py  暴露給用戶的配置文件
        urls.py  路由與視圖函數對應關係
        wsgi.py     runserver命令就使用wsgiref模塊作簡單的web server
        
    應用名(app)
        migrations文件夾  存放數據庫遷移記錄的
        admin.py  django後臺管理
        apps.py  註冊相關
        models.py  模型類 
        tests.py  測試文件
        views.py  存放視圖函數
    templates文件夾  存放html文件
    manage.py  django入口文件,管理文件

[TOC]

diango鏈接數據庫以及配置

  1. django默認自帶的一個小型的sqlite數據庫 該數據庫功能不是很強大 尤爲是對日期格式的數據 不是很兼容
  2. django默認使用的是mysqldb模塊鏈接數據庫 可是該模塊不兼容 不推薦使用
  3. 使用mysql進行以下配置
第一步配置文件中配置
                DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.mysql',  # 指定數據庫 MySQL postgreSQL
                        'NAME': 'day56',  # 到底使用哪一個庫
                        'USER':'root',
                        'PASSWORD':'root',
                        'HOST':'127.0.0.1', 
                        'PORT':3306,
                        'CHARSET':'utf8'#編碼
                    }
                }
    
            第二步 
                django默認使用的是mysqldb鏈接數據庫  可是該模塊不支持了
                因此你要告訴django不要用mysqldb該用pymysql鏈接
                
                你能夠在項目名下面的__init__.py也能夠在應用名下面的__init__.py文件中指定
                import pymysql
                pymysql.install_as_MySQLdb()

pycharm鏈接數據庫MySQL(pycharm充當數據庫的客戶端)

pycharm中找數據庫的三種方式

下載database插件

時區錯誤

Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

若是出現時區錯誤的話,有倆種不過方法

方法1

jdbc:mysql://localhost:3306?serverTimezone=GMT

在URL的後面添加?serverTimezone=GMT,可是比較麻煩,每次都要進行配置時區,建議採用方法二


方法2配置時區

鏈接數據庫成功和會出現的問題

pycharm鏈接數據庫sqlite

一共兩步


相關文章
相關標籤/搜索