django框架

1.软件开发架构

cs架构
bs架构
# 本质bs也是cs

2.纯手工web框架

2.1准备知识HTTP协议

 ***1.HTTP协议定义***
		***网络协议***
		HTTP协议				       数据传输是明文
		HTTPS协议				     数据传输是密文
		websocket协议		       数据传输是密文
*** 2.HTTP协议四大特性***
	1.基于请求响应
	2.基于TCP、IP作用于应用层之上的协议
	3.无状态        不保存用户的信息
	4.短/无链接   请求来一次响应一次 之后我们没有任何链接和关系
	   长链接:双方建立连接之后默认不断开 websocket
*** 3.HTTP协议数据格式***
	请求首行 (标识HTTP协议版本,当前请求方式)
	请求头 (一大堆k,v键值对)
	\r\n
	请求体
 ***4.响应状态码***
	1XX             服务端已成功接收到了你的数据正在处理,你可以继续提交额外的数据
	2XX			        服务端成功响应了你想要的数据(200 OK请求成功)
	3XX			        重定向
	4XX			        请求错误(404:请求资源不存在;403:当前请求不合法或者不符合访问资源的条件)
	5XX			        服务器内部错误(500)

2.2准备知识python三大主流web框架

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

2.3准备知识动静态网页

1.定义

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

2.动态网页制作

import datetime
def get_time(env):
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')

2.4如何将后端获取到的数据"传递"给html文件

with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
    data = f.read()
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

后端获取数据库中数据展示到前端页面

2.5如何做到后缀的不同返回不同的内容

方法1. 拿到用户输入的后缀 做判断 
  	 不足之处
  		1.代码重复(服务端代码所有人都要重复写)
  		2.手动处理http格式的数据 并且只能拿到url后缀 其他数据获取繁琐(数据格式一样处理的代码其实也大致一样 重复写)
  		3.并发的问题
方法2 借助于wsgiref模块
"""
urls.py						   路由与视图函数对应关系
views.py					    视图函数(后端业务逻辑)
templates文件夹		   专门用来存储html文件
"""
1. 按照功能的不同拆分之后 
2. 后续添加功能只需要在urls.py书写对应关系
3. 然后取views.py书写业务逻辑即可

2.6模版语法之Jinja2模块

pip3 install jinja2
"""模版语法是在后端起作用的"""
#模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}
{% 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%}

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

2.8wsgiref模块

wsgiref模块

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

3.Django

3.1注意事项

*** 1.如何让你的计算机能够正常的启动django项目***
	  1.计算机的名称不能有中文
		2.一个pycharm窗口只开一个项目 # 不要文件夹套文件夹
		3.项目里面所有的文件也尽量不要出现中文
		4.python解释器尽量使用3.4~3.6之间的版本
			(如果你的项目报错 你点击最后一个报错信息
			去源码中把逗号删掉)
*** 2. django版本问题***
	1.X 2.X 3.X(最新版本)
  1.X和2.X本身差距也不大 
  公司之前用的1.8  有一些项目用的2.0
 	django版本图
*** 3. django安装***
	pip3 install django==1.11.11
  如果已经安装了其他版本 无需自己卸载直接重新装 会自动卸载安装新的
  如果报错 看看是不是timeout 如果是 那么只是网速波动重新安装即可
  验证是否安装成功的方式1
  终端输入django-admin看看有没有反应

3.2django基本操作

1.命令行操作 1.创建django项目

  	你可以先切换到对应的D盘 然后再创建
  	django-admin startproject mysite
    	mysite文件夹
      	manage.py
      	mysite文件夹
        	__init__.py
        	settings.py
          urls.py
          wsgi.py

2.启动django项目

	"""
		一定要先切换到项目目录下	
		cd /mysite
	"""
  python3 manage.py runserver
  #http://127.0.0.1:8000/

3.创建应用

"""
Next, start your first app by running python manage.py startapp [app_label].
"""
	python manage.py startapp app01
    应用名应该做到见名知意
      user
      order
      web
      ...
      但是我们教学统一就用app01/02/03/04

2.pycharm操作

  1 new project 选择左侧第二个django即可
  2 启动
  		1.还是用命令行启动
    	2.点击绿色小箭头即可
  3 创建应用
  		1.pycharm提供的终端直接输入完整命令
    	2.pycharm 
      		tools 
        		run manage.py task提示(前期不要用 给我背完整命令)
 4 修改端口号以及创建server	
		edit confi....

3.3应用

django是一款专门用来开发app的web框架 django框架就类似于是一所大学(空壳子) app就类似于大学里面各个学院(具体功能的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并且自动注册


3.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			视图函数(视图层)

3.5命令行与pycharm创建的区别

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

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
]

2.命令行创建

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
]

在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径 'DIRS': [os.path.join(BASE_DIR, 'templates')]

3.6django小白必会三板斧

视图函数views.py 定义函数后返回三种格式 三种格式本质都是HttpResponse类的实例化对象(源码得出)

1.HttpResponse
	返回字符串类型的数据
2.render
	返回html文件的,且返回浏览器以前还可以给html文件传参,还可以利用模版语法进行一些其他操作
3.redirect
	重定向
	return redirect('https://www.mzitu.com/')
	return redirect('/home/')