Django介紹

django推導思路

import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)


while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    print(data)
    data = data.decode('utf-8')
    current_path = data.split('\r\n')[0].split(' ')[1]
    if current_path == '/index':
        # conn.send(b'<h1>hello baby!</h1>')
        with open('web.html','rb') as f:
            conn.send(f.read())
    else:
        conn.send(b'404')
    conn.close()
純手寫的web框架
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
web.html
from wsgiref.simple_server import make_server
from urls import urls
from views import *


def run(env,response):
    print(env)  # 是個字典類型
    # 固定寫法
    response('200 OK',[])  # 列表裏面放的是請求首行的信息,能夠不放,可是必須寫
    # 獲取當前用戶訪問路徑
    current_path = env.get('PATH_INFO')
    # 定義一個函數標誌位
    func = None
    for url_list in urls:  # urls:[[],[],[]]  url_list:['',func]
        if current_path == url_list[0]:
            func = url_list[1]
            # 結束for循環了
            break
    if func:
        res = func(env)
    else:
        # 匹配不上 走error
        res = error(env)
    return [res.encode('utf-8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1',8888,run)
    server.serve_forever()
基於wsgiref實現服務端.py
from views import *

urls = [
    ['/index',index],
    ['/login',login],
    ['/reg',reg],
    ['/get_time',get_time],
    ['/xxx',get_user],
    ['/get_db',get_db_info]
]
urls.py
from datetime import datetime
from jinja2 import Template
import pymysql


def index(env):
    with open('templates/index.html','r',encoding='utf-8') as f:
        data = f.read()
    return data

def login(env):
    return 'login'

def error(env):
    return '404 error'

def reg(env):
    return 'reg'

def get_time(env):
    ctime = datetime.now().strftime('%Y-%m-%d %X')
    # 打開文件
    with open('templates/get_time.html','r',encoding='utf-8') as f:
        data = f.read()
    res = data.replace('@@time@@',ctime)
    return res

def get_user(env):
    user = {'name':'jason','age':'18'}
    with  open('templates/get_user.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(data=user)
    return res

def get_db_info(env):
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = '123321',
        database = 'test007',
        charset = 'utf8',
        autocommit = True
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute('select * from userinfo')
    user_list = cursor.fetchall()
    # 打開文件渲染到前端頁面
    with open('templates/get_db_user.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user_list=user_list)
    return res
views.py

templates文件夾存放html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <table class="table table-bordered table-hover table-striped">
            <thead>
                <tr>
                    <th>id</th>
                    <th>name</th>
                    <th>age</th>
                </tr>
            </thead>
            <tbody>
                {% for data in user_list %}
                <tr>
                    <td>{{data.id}}</td>
                    <td>{{data.name}}</td>
                    <td>{{data.age}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>
</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.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
@@time@@
</body>
</html>
get_time
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h1>{{ data }}</h1>
<h1>{{ data.name }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('name') }}</h1>
<h1>{{ data.age }}</h1>
</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.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h1>index</h1>
</body>
</html>
index.html

web服務執行流程

 瀏覽器發送二進制遵循http協議的數據,服務器接收先url匹配,在執行視圖函數,視圖函數中調用模版和數據庫數據渲染。css

python三大主流web框架

"""
a:socket通訊
b:路由與視圖
c:模版渲染

django:a用的別人的wsgiref,b:本身寫的,c:本身寫的
flask:a用的別人的werkzeug,b:本身寫的,c:用了別人的jinja2
tornado:a本身寫的,b:本身寫的,c:本身寫的
"""

django的安裝

#注意事項:
- django安裝版本建議1.11左右
- 計算機名稱不能是中文(尤爲要注意),更名重啓便可!
- django安裝命令pip install django==1.11.11
- 文件夾不要再以dayxx多層疊加,一個項目就是一個單獨的pycharm窗口
    命令行建立django項目
        django-admin startproject mysite
    命令行建立app
        python manage.py startapp 應用名
    命令行啓動django
        python manage.py runserver
  用命令行建立的時候,默認沒有templates文件夾,須要你本身手動建立
    而且在settings配置文件中寫上路徑
    
pycharm下載
    點加號 選版本
    建立new project選第二個django項目(選本機環境,暫時不要選虛擬環境)
    兩種建立app的方式:
        python manage.py startapp 應用名
        tools下面的run manage.py 可以簡寫並自動提示
    運行方式
        python manage.py runserver
        pycharm自動啓動

模塊文件配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夾位置
        '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',
            ],
        },
    },
]

static靜態文件配置

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 靜態文件存放位置
]

 

目錄介紹

app01
    migrations    #數據庫遷移記錄相關
    models.py   #orm模型類
    views.py     #視圖函數
    templates    #放html文件
manage.py  # 管理文件
    mysite  # 項目目錄
        __init__.py
        settings.py  # 配置
        urls.py  # 路由 --> URL和函數的對應關係
        wsgi.py  # runserver命令就使用wsgiref模塊作簡單的web serve

django小白必會三板斧

  1. HttpResponse 返回字符串
  2. render 渲染頁面並返回
  3. redirect 重定向
相關文章
相關標籤/搜索