初识django

HTTP协议

 超文本传输协议

四大特性:

  1.基于TCP/IP作用在应用层上的协议

  2.基于请求响应

  3.无连接

  4.无状态

数据格式之请求

  请求首行

  请求头(一堆k,v键值对)

  /r/n

  请求体

数据格式值响应

  响应首行

  响应头(一堆k,v键值对)

  /r/n

  响应体

响应状态码

       10x   服务端已经接受你的数据 正在处理 你可以继续提交数据

  20x   请求成功

  30x   重定向

  40x   请求错误(404:请求资源不存在)

  50x   服务器内部错误

动静态网页
    静态页面:
        数据是写死的 万年不变
     动态页面:
        数据是实时获取的 比如后端获取当前时间展示到前端,从数据库获取数据展示到前端等


推导版本(django)
首先创建web框架

import socket

"""
请求头
b'GET / HTTP/1.1\r\n'  
请求首行(一大堆的k,v键值对组成)
b'Host: 127.0.0.1:8080\r\n' 
b'Connection: keep-alive\r\n' 
b'Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n'
请求体
"""
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('01 纯手撸版本对应的html页面.html','rb') as f:
            conn.send(f.read())
    else:
        conn.send(b'404')
    conn.close()

web框架

然后基于wsgiref实现服务端

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()

服务端

然后路由实现映射视图

from views import *

urls = [
    ['/index',index],
    ['/login',login],
    ['/reg',reg],
    ['/get_time',get_time],
    ['/xxx',get_user],
    ['/get_db',get_db_info]
]

视图渲染页面

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

其中html文件可放在 templates文件夹中

<!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_db_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.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>{{ 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

模板语法(接近python语法)
<h1>{{ data }}</h1>
<h1>{{ data.name }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('name') }}</h1>
<h1>{{ data.age }}</h1>
jinja循环:
            {% for data in user_list %}
                <tr>
                    <td>{{data.id}}</td>
                    <td>{{data.name}}</td>
                    <td>{{data.age}}</td>
                </tr>
                {% endfor %}
模板渲染(雏形):
    后端获取数据,传递给前端页面,页面上可以通过某些方法,使用到后端传递过来的数据
推导思路
    1.纯手写
    2.借助wsgiref帮我实现socket这块
    3.先拆分成不同文件 模块渲染由自己的字符串替换变成第三方模块(jinja2)

推导流程图:
python三大主流web框架介绍
    django(大而全)
    flask(小而精)
    tornado(异步非阻塞)

a:socket
b:路由与视图函数
c:模板渲染

django:a:用的别人的wsgiref b:自己写的 c:自己写的
flask:a:用的别人的werkzeug b:自己写的 c:用的别人的jinja2
tornado:都是自己写的
django简介
注意:
    1.django版本
    2.计算机名不能是中文
    3.一个pycharm窗口就一个工程
安装
    命令行下载
        pip3 install django==1.11.11
    命令行创建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自动启动

创建的app需要在settings里进行添加:

还可以修改端口号:


django主要文件介绍
   app01
      migrations 数据库迁移记录相关
      models.py   orm模型类
      views.py   视图函数
   templates  放html文件
   manage.py  django的启动入口文件
   项目名下
      setttings.py   django项目的配置文件
      urls.py          路由与视图函数的映射关系

django小白必会三板斧
    HttpResponse  返回字符串
    render  渲染页面并返回
    redirect 重定向



django默认能够自动重启,但是速度可能没有那么快

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python算法题----逆序列表

        有这样一个列表[1, 2, 3, 4, 5, 6, 7, 8, 9]编程实现该列表逆序排列,将其变为[9, 8, 7, 6, 5, 4, 3, 2, 1...

    py3study
  • Python_冒泡排序

    从小到大的排序:(最前面的数和一步步和后面的数比较,如果大于则交换,如果不大于则继续循环)

    py3study
  • Python+Lucene

    pylucene让Python可以调用Lucene API实现搜索,这个项目紧跟Lucene的步调,对用惯了Python的同学来说是个福音。 pylucen...

    py3study
  • Android 拍照 与 相册选择图片

    剑行者
  • 为什么S/4HANA的销售订单创建会触发生产订单的创建

    调用S/4HANA销售订单创建函数SD_SALES_DOCU_MAINTAIN创建一个销售订单时,会触发生产订单的创建。

    Jerry Wang
  • 每个优秀程序员必须具备的技术技能

    我特别支持软件开发者在他们掌握技术技能的同时去学习“软技能”——事实上,我写了一本关于这方面的书——但是不可否认的是:技术技能很重要。 我的意思是,如果你不能编...

    李海彬
  • 每个优秀程序员必须具备的技术技能

    我特别支持软件开发者在他们掌握技术技能的同时去学习“软技能”——事实上,我写了一本关于这方面的书——但是不可否认的是:技术技能很重要。

    哲洛不闹
  • 深度优先搜索(DFS)

    里面有着大大小小的文件以及子文件夹,当你需要搜索一个名字为:仙士可.txt的文件时

    仙士可
  • web前端工程化利刃——weback简介

    一次内部webpack基础培训的文档和代码分享。简单了解webpack及入门。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代码地址: https:...

    itmifen
  • 南京推进旅游新方式,区块链旅游大势已成

    在产业融合的大背景下,工业旅游作为一种全新业态,成为“旅游+”的重要增长点。7月24日,南京启动工业旅游管理人员培训,来自全市各区旅游部门分管领导及相关工业旅游...

    区块链先锋

扫码关注云+社区

领取腾讯云代金券