django01--web框架推导、django简单介绍

内容概要

  • 我们自己写一个简易版本的web框架(代码无需掌握,重点在于理解思路)
  • django框架

一 自定义web框架

1 纯手撸web框架

# 原理:
   利用socket编程,客户端/服务端按照Http协议,请求/返回数据
   服务端拿到用户输入的请求后缀 做判断,返回不同的内容

# 不足之处
  1.代码重复 (服务端代码所有人都要重复写)
  2.手动处理http格式的数据 并且只能拿到url后缀 其他数据获取繁琐
    数据格式一样处理的代码,其实也大致一样 重复写
  3.并发的问题
  
# 代码:见day59/01 纯手撸web框架.py


# HTTP协议

# 网络协议
  HTTP协议	数据传输是明文
  HTTPS协议	数据传输是密文
  websocket协议	数据传输是密文

# 四大特性
  1.基于请求响应
  2.基于TCP、IP作用于应用层之上的协议
  3.无状态
  4.短/无链接

# 数据格式
  请求首行
  请求头
     # 空行
  请求体

# 响应状态码
  1XX
  2XX		 200
  3XX			
  4XX		 403 404
  5XX		 500
  # 在公司中还会自定义更多的状态码
     一般都是以10000起步

2 借助于其他模块

2.1 自定义简易版本web框架请求流程图

# 服务端主要功能:
  1.接受http格式数据   # 解析
  2.逻辑处理           # 处理
  3.封装http格式数据   # 返回

# 1/3部分,交由wsgiref模块处理
    
# 2部分  按照功能的不同 拆分
  urls.py		路由与视图函数对应关系
  views.py		视图函数(后端业务逻辑)
  templates文件夹	专门用来存储html文件
    
# 代码:见day59/02 基于wsgiref模块.py

2.2 wsgiref模块

# 可以帮助来解析和封装 http格式的数据
  1.请求来的时候  解析http格式的数据 封装成大字典
  2.响应走的时候  给数据打包成符合http格式 再返回给浏览器

2.3 动静态网页

# 静态网页
  页面上的数据是直接写死的 万年不变
	
# 动态网页
  数据是实时获取的
    
  eg:
    1.后端获取当前时间展示到html页面上
    2.数据是从数据库中获取的展示到html页面上  


# 动态网页制作
import datetime
def get_time(env):
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
    # 如何将后端获取到的数据"传递"给html文件?
    with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
        data = f.read()
        # data就是一堆字符串
    data = data.replace('dwadasdsadsadasdas',current_time)   # 在后端将html页面处理好之后再返回给前端
    return data

# 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
from jinja2 import Template
def get_dict(env):
    user_dic = {'username':'jason','age':18,'hobby':'read'}
    with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user=user_dic)
    # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
    return res

# 后端获取数据库中数据展示到前端页面
import pymysql
def get_user(env):
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = 'admin123',
        db='day59',
        charset = 'utf8',
        autocommit = True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from userinfo'
    affect_rows = cursor.execute(sql)
    data_list = cursor.fetchall()  # [{},{},{}]
    # 将获取到的数据传递给html文件
    with open(r'templates/05 get_data.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user_list=data_list)
    # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
    return res


# 如下利用 jinjia2中的Template 模板渲染来实现
  模板语法

2.4 模版语法之Jinja2模块

pip3 install jinja2

"""模版语法是在后端起作用的,然后将渲染好的html字符串 返回给前端 """

# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}

# 模板 for循环
{% for user_dict in user_list %}
    <tr>
        <td>{{ user_dict.id}}</td>
        <td>{{ user_dict.username}}</td>
        <td>{{ user_dict.password}}</td>
        <td>{{ user_dict.hobby}}</td>
    </tr>
{% endfor%}

二 python三大主流web框架

# web框架
  Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发
  这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法
  web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了
  浏览器和服务器的是基于HTTP协议进行通信的


# django
  特点:大而全 自带的功能特别特别特别的多 类似于航空母舰
  不足之处:
     有时候过于笨重

# flask
  特点:小而精  自带的功能特别特别特别的少 类似于游骑兵
       第三方的模块特别特别特别的多,如果将flask第三方的模块加起来完全可以盖过django
       并且也越来越像django
  不足之处:
    比较依赖于第三方的开发者
		
# tornado
  特点:异步非阻塞 支持高并发
      牛逼到甚至可以开发游戏服务器


# 框架大致可以分成三部分:
  A:socket部分
  B:路由与视图函数对应关系(路由匹配)
  C:模版语法

django
  A用的是别人的	====》 wsgiref模块
  B用的是自己的
  C用的是自己的(没有jinja2好用 但是也很方便)

flask
  A用的是别人的 ====》 werkzeug(内部还是wsgiref模块)
  B自己写的
  C用的别人的   ====》jinja2 

tornado
  A,B,C都是自己写的

三 Django框架

1 django必备知识点

# 如何让你的计算机能够正常的启动django项目
  1.计算机的名称不能有中文
  2.一个pycharm窗口只开一个项目
  3.项目名和文件名尽量不要出现中文
    
# django版本问题
  1.X 、 2.X 、 3.X(支持异步)


面试问到 Django的版本?
  回答:公司之前用的1.8 慢慢过渡到了1.11版本 有一些新项目用的2.0
 
# django安装
  pip3 install django==1.11.11
  
  验证是否安装成功的方式1
     终端输入django-admin看看有没有反应

2 django基本操作

#####命令行操作
# 1.创建django项目
  django-admin startproject mysite  # 你可以先切换到对应的D盘 然后再创建
    
  mysite
    manage.py
    mysite文件夹
        __init__.py
    settings.py
    urls.py
    wsgi.py
            
# 2.启动django项目
  python3 manage.py runserver  # 一定要先切换到项目目录下  cd /mysite
  # http://127.0.0.1:8000/  默认本地IP 加 8000 端口

# 3.创建应用
  python3 manage.py startapp app01
    
  应用名应该做到见名知意
    user
    order
    web
    ...
   

#####pycharm操作
# 1 new project 选择左侧第二个django即可
  
# 2 启动
  1.点击绿色小箭头即可
  2.或还是用命令行启动

# 3 创建应用
  1.pycharm 
    tools 
    run manage.py task提示(前期不要用 给我背完整命令)
                
  2.或pycharm提供的终端直接输入完整命令

# 4 修改端口号以及创建server	
  edit Configurations

3 app应用

# django是一款专门用来开发app的web框架
  一个app就是一个独立的功能模块

  django框架就类似于是一所大学(空壳子)
  app就类似于大学里面各个学院(具体功能的app)
      比如开发淘宝
	订单相关
	用户相关
	投诉相关
	创建不同的app对应不同的功能
	
	选课系统
	   学生功能
	   老师功能



***********************创建的应用一定要去配置文件中注册**********************
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  	# 全写
    'app01',			# 简写
]

# 创建出来的的应用第一步先去配置文件中注册

ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个app并且自动注册

4 主要文件介绍

-mysite项目文件夹
  --mysite文件夹
    ---settings.py	配置文件
    ---urls.py		路由与视图函数对应关系(路由层)
    ---wsgi.py		wsgiref模块(不考虑)
    
  --manage.py		django的入口文件

  --db.sqlite3		django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
    
  --app01文件夹
    ---admin.py		django后台管理
    ---apps.py		注册使用
    ---migrations文件夹  数据库迁移记录
    ---models.py	数据库相关的 模型类(orm)
  	---tests.py	测试文件
    ---views.py		视图函数(视图层)

5 命令行与pycharm创建的区别

# 1.命令行创建不会自动有templates文件夹 需要你自己手动创建;
    而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径

# pycharm创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
    }
]
        
# 命令行创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
     }   
]
   
    
# 注意强调:
  1.用命令创建django项目时 需要创建templates文件夹,还需要去配置文件中配置路径
    'DIRS': [os.path.join(BASE_DIR, 'templates')]

6 django小白必会三板斧

# view 返回数据

HttpResponse
  返回字符串类型的数据

render
  返回html文件

redirect
  重定向
  return redirect('https://www.mzitu.com/')  重定向外部
  return redirect('/home/')   重定向内部自己的 (就不用加IP和端口)
posted @ 2021-09-10 01:28  Edmond辉仔  阅读(30)  评论(0)    收藏  举报