Django知识整理一(Http协议,wsgire模块,动静态网页介绍,python三大主流框架,Django安装的注意事项,) http协议 wsgiref模块 动静态网页 python三大主流框架 安装Django前注意事项

四大特性

  • 基于tcp/ip协议之上作用于应用层
  • 基于响应 请求
  • 无状态
  • 无连接

数据格式

请求方式

  • get请求 :朝别人要数据
  • post请求 : 朝别人提交数据

请求格式

  • 请求首行(请求格式,协议版本)
  • 请求头(一大推k:v键值对)
  • (空格)
  • 请求体(get请求没有请求体)

响应格式

(格式与请求格式相同)

响应状态码

1xx:服务器成功接收到你的数据,正在处理,你可以继续提交其他数据

2xx: 服务器响应成功 (200 ok)

3xx: 重定向

4xx: 请求错误(404 请求资源不存在. 403 拒绝访问)

5xx: 服务器内部错误

wsgiref模块

它是一个web服务网关接口,它主要做了下面几件事:

  1. 自动帮你封装好了socket代码

  2. http数据自动帮你处理好了:

    • 请求来的时候自动帮你处理http数据格式,返回一串字典格式的数据.
    • 响应走的时候帮你把字典格式的数据封装成了符合http协议的数据格式
  3. 根据不同的功能拆分成不同的py文件

  • urls.py 路由与视图函数对应关系
  • views.py 处理后端业务逻辑的视图函数 (视图函数不单单只是函数,也可以是类)
  • templates 专门存放html文件

规律: 只要你想添加功能 只需要在urls.py中添加一条对应关系再去views.py写一个视图函数

动静态网页

静态网页: 数据是写死的,万年不变

动态网页: 数据是实时获取的

  • 如果将后端获取到的时间(字符串)传递给前端页面,可以利用字符串的替换 实现数据传递(replace方法)
from datetime import datetime

def get_time(env):
    current_time = datetime.now().strftime('%Y-%m-%d %X')
    with open(r'D:上海Python11期视频python11期视频day56	emplatesget_time.html','r',encoding='utf-8') as f:
        data = f.read()
    data = data.replace('$$time$$',current_time)

    return data

前端

<!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>
$$time$$
</body>
</html>
  • 如果将字典传递给前端页面,并且可以在前端使用字典的方法,就需要借助于jinjia2模块,实现模块的渲染

    jinja2 下载
    pip3 install jinja2
    
    from jinja2 import Template
    
    def get_user(env):
        d = {'name':'jason','pwd':'123','hobby':		 ['read','running','music']}
        with open(r'D:上海Python11期视频python11期视频day56	emplatesget_user.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(user=d)  # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
        return res
    

    前端

    <!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>
    

    模板的渲染 : 利用 模板语法,实现后端传递数据给前端html页面模板语法的书写格式;

    • 模板语法(极其贴近python后端语法)

      	#变量名
      	<p>{{ user }}</p>
      	<p>{{ user.name }}</p>
      	<p>{{ user['pwd'] }}</p>
      	<p>{{ user.get('hobby') }}</p>
      	#语法
      	{% for user_dict in user_list %}
      		<tr>
      			<td>{{ user_dict.id }}</td>
      			<td>{{ user_dict.name }}</td>
      			<td>{{ user_dict.pwd }}</td>
      		</tr>
      	{% endfor %}
      
  • 如果将数据库中的数据传给前端

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	emplatesget_db.html','r',encoding='utf-8') as f:
        data = f.read()
    temp = Template(data)
    ret = temp.render(user_list = res)  # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典

前端

<!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>

以上是为了加深理解动态网页而举的三个例子

python三大主流框架

Django

  • 特点 :大而全,自带的功能特别多,类似于航空母舰
  • 缺点: 有时候过于笨重

Flask:

  • 特点: 小而精, 第三方的模块特别多, 类似游骑兵(如果将flask第三方模块全部加起来,完全可以超过Django)
  • 缺点 : 自带功能特别少 , 比较依赖于第三方模块

Tornado

  • 异步非阻塞
  • 速度快,牛逼到可以开发游戏服务器
A:socket部分
B:路由与视图函数对应关系
C:模板语法

Django:
	A用的别人的  wsgiref
	B自己写的
	C自己写的
Flask
	A用的别人的  werkzeug(基于wsgiref)
	B自己写的
	C用的别人的  jinja2
Tornado
	三者全是自己写的

安装Django前注意事项

  • 计算机不能为中文
  • 一个pycharm窗口代表一个项目
  • 项目名或者路径里不要有中文

下载安装Django

pip3 install django==1.11.11(命令行)

验证Django是否安装成功

django-admin

一个django项目就类似于是一所大学,而app就类似于大学里面的学院
django其实就是用来存放一个个应用的,django支持任意多个app(应用)
一个app就相当于一块独立的功能
用户功能
管理功能

命令行使用

创建django项目
	django-admin startproject mysite(项目名)
启动django项目
	python manage.py runserver 
创建应用app
	python manage.py startapp app01(应用名)


注意:
1.使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
2.templates文件夹创建完成后还需要到settings文件中手动在TEMPLATES项里写配置
    [os.path.join(BASE_DIR, 'templates')]
3. 新创建的app文件夹需要你去settings配置文件中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
    完整语法:'app01.apps.App01config'
    简写:'app01'
    

pycharm使用

直接在pycharm中新建一个django项目
注意:
    pycharm只会帮你自动注册第一个你在创建项目的时候写的应用,之后的应用需要自己手动在settings中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
    完整语法:'app01.apps.App01config'
    简写:'app01'
'''
项目名
    跟项目名同名的文件夹
        settings.py  暴露给用户的配置文件
        urls.py  路由与视图函数对应关系
    应用名
        migrations文件夹  存放数据库迁移记录的
        admin.py  django后台管理
        apps.py  注册相关
        models.py  模型类 
        tests.py  测试文件
        views.py  存放视图函数
    templates文件夹  存放html文件
    manage.py  django入口文件
'''