Python全棧之路-Django(一)

Web框架的本質

包含如下知識點:
- socket
- http協議
- HTML知識
- 數據庫(pymysql,SQLAlchemy)html

1 網站訪問的流程

博客園(socket服務端python

1.監聽IP和端口,默認80
3.收到用戶請求
4.響應用戶請求mysql

瀏覽器(socket客戶端)web

2.用戶訪問博客園,即瀏覽器輸入博客園地址www.cnblogs.com,進行DNS解析並與博客園服務器創建鏈接
5.接收博客園發送的響應信息
6.斷開鏈接sql

HTTP請求是無狀態的數據庫

2 Web框架本質

靜態網站django

#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/5/13

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 8001))
sock.listen(5)


def index(request):
    """
    處理用戶請求,並返回響應內容
    :param request: 
    :return: 
    """
    f = open('index.html', 'rb')
    data = f.read()
    f.close()
    return data


def article(request):
    f = open('article.html', 'rb')
    data = f.read()
    f.close()
    return data

routes = [
    ('/index', index),
    ('/article', article),
]


def run():
    while True:
        conn, addr = sock.accept()
        data = conn.recv(8096)
        data = str(data, encoding='utf8')
        headers,bodys = data.split('\r\n\r\n')
        temp_list = headers.split('\r\n')
        method,url,protocal = temp_list[0].split(' ')

        func_name = None
        for item in routes:
            if item[0] == url:
                func_name = item[1]
                break
        if func_name:
            response = func_name(data)
        else:
            response = b'404'

        if response == b'404':
            conn.send(b'HTTP/1.1 404 NOT FOUND\r\n\r\n')
        else:
            conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
        conn.send(response)

        conn.close()

if __name__ == "__main__":
    run()

動態網站flask

#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/5/13

import socket
import time
import pymysql

sock = socket.socket()
sock.bind(('127.0.0.1', 8001))
sock.listen(5)


def index(request):
    """
    處理用戶請求,並返回響應內容
    :param request: 
    :return: 
    """
    f = open('index.html', 'rb')
    data = f.read()
    f.close()
    return data


def article(request):
    f = open('article.html', 'r', encoding='utf8')
    data = f.read()
    f.close()
    ctime = time.time()
    data = data.replace('@@sw@@', str(ctime))
    data = bytes(data, encoding='utf8')
    return data

def users(request):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='db02', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute('select id,name,email from users')
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    print(user_list)
    content_list = []
    for row in user_list:
        tp = '''<tr>
            <td>%s</td>
            <td>%s</td>
            <td>%s</td>
        </tr>'''%(row['id'], row['name'], row['email'])

        content_list.append(tp)
    content=''.join(content_list)
    f = open('users.html', 'r', encoding='utf8')
    template = f.read()
    f.close()
    template = template.replace('@content@', content)
    template = bytes(template,encoding='utf8')
    return template



routes = [
    ('/index', index),
    ('/article', article),
    ('/users', users)
]


def run():
    while True:
        conn, addr = sock.accept()
        data = conn.recv(8096)
        data = str(data, encoding='utf8')
        headers,bodys = data.split('\r\n\r\n')
        temp_list = headers.split('\r\n')
        method,url,protocal = temp_list[0].split(' ')

        func_name = None
        for item in routes:
            if item[0] == url:
                func_name = item[1]
                break
        if func_name:
            response = func_name(data)
        else:
            response = b'404'

        if response == b'404':
            conn.send(b'HTTP/1.1 404 NOT FOUND\r\n\r\n')
        else:
            conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
        conn.send(response)
        conn.close()

if __name__ == "__main__":
    run()

總結:瀏覽器

1. HTTP協議,無狀態、短鏈接
2.瀏覽器(socket客戶端)
3.本身寫網站
    - a socket服務端
    - b 根據URL不一樣返回不一樣的內容
        - 路由系統 URL -> 函數
    - c 字符串返回給用戶
        - 模板引擎的渲染
            - HTML充當模板(包含特殊字符)
            - 本身創造任意數據
4.Web框架
    框架種類:
        - a b c Tornado
        - b c   Django(經過wsgiref完成a功能)
        - b     flask 

    另一種分類:
        - Django
        - 其餘

2 Django框架

安裝Django框架服務器

pip3 install django

命令建立並啓動

建立Django項目

django-admin startproject mysite

目錄結構

mysite
|____manage.py      # 對當前Django程序全部操做能夠基於 python manage.py runserver
|____mysite
| |______init__.py
| |____settings.py   # Django的配置文件
| |____urls.py       # 路由系統:url -> 函數
| |____wsgi.py       # 用於定義Django用什麼實現socket服務端(wsgiref)

啓動Django項目

cd mysite
python manage.py runserver 127.0.0.1:8080

訪問:http://localhost:8080/

PS: pycharm也能夠輕鬆建立

第一個Django請求

mysite/mysite/urls.py 文件
from django.conf.urls import url
from django.contrib import admin

from django.shortcuts import HttpResponse
def login(request):
    """
    處理用戶請求,並返回內容
    :param request: 用戶請求相關的全部信息(對象)
    :return: 
    """
    return HttpResponse('login')
urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^login/', login),
]

Django程序建立步驟

1.建立Project

2.配置
- 模板路徑(默認便可)
- 配置靜態文件路徑
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
3.額外配置 註釋該行

# 'django.middleware.csrf.CsrfViewMiddleware',
相關文章
相關標籤/搜索