后端框架django

后端框架

1.纯手撸web简易框架

软件开发架构

C/S架构

b/s架构

本质bs也是cs架构

wed 框架的本质:

所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。

web后端

import socket

server = socket.socket()
server.bind(('127.0.0.1',8080))# 绑定IP和端口
server.listen(5)# 监听
"""
请求首行
b'GET / HTTP/1.1

请求头
Host: 127.0.0.1:8080

Connection: keep-alive

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh;q=0.9



请求体
'
"""

while True:
    # 等待连接
    conn, addr = server.accept()
    data = conn.recv(1024) # 接收客户端发来的消息
    conn.send(b'HTTP/1.1 200 OK

') # 因为要遵循HTTP协议,所以回复的消息也要加状态行
    # print(data) # 从data中取到路径
    data = data.decode('utf-8')  # 一串字符串# 把收到的字节类型的数据转换成字符串
    target_url = data.split('
')[0].split(' ')[1]
    # 判断url返回响应的内容即可
    if target_url == '/index':
        # conn.send(b'index')
        with open(r'D:上海校区python13期视频day491 demo.html','rb') as f:
            conn.send(f.read())
    elif target_url == '/login':
        conn.send(b'login')
    else:
        conn.send(b'404 error')
    conn.close()

需求

1.根据用户输入不同的后缀返回不同的内容

从符合http协议格式的数据中获取用户输入的后缀

不足之处:

1.socket代码是我们自己写的 
2.http数据也是我们自己处理的

HTTP协议

超文本传输协议  
规定了浏览器与服务端之间数据传输的格式

1.HTTP协议四大特性

1.基于请求响应(一次请求对应一次响应)
2.基于TCP/IP 作用于应用层之上的协议。
3.无状态
不保留客户端的状态
无论你来多少次 我都待你入初见
cookie   session    token  ...

- cookies: 存放在浏览器(客户端)的用户信息
- session: 存放在服务端的用户信息
  4.无连接
  长链接   websocket(类似于http协议的大补丁)  聊天室相关

2.数据格式

请求格式
请求首行(请求方式 协议版本)
请求头(一大堆k,v键值对)
		
请求体(携带的数据 并不是一直都有 有时候可能是空的 取决于你的请求方式)

响应格式
	响应首行(响应状态码)
	响应头(一大堆k,v键值对)
			
响应体(浏览器展示给用户看的数据)

3.响应状态码

用数字来表示一大堆提示信息
		1XX:服务端已经成功接收到客户端的数据正在处理  你可以继续提交
		2XX:200请求成功 服务端已经返回了你想要的数据
		3XX:重定向(原本想访问A但是内部自动给你转到了B上面)
		4XX:404请求资源不存在,403你当前不具备请求该资源的条件
		5XX:500服务端内部错误 机房卓火了 宕机  爆炸了
		公司内部可以自己定制自己的响应状态码

请求方式

1.get请求
		朝服务端要资源(获取数据)
		类似于浏览器窗口输入www.baidu.com获取百度首页
2.post请求
		朝服务端提交数据(提交数据)
		类似于登录注册功能

3.基于wsgiref模块撸

根据功能的不同拆分成不同的文件
用户在浏览器窗口输入url之所以能够获取到相应的资源
是因为后端早已经开设了相应的资源接口

基于wsgiref模块以及文件拆分的特点

只要你想要开设新的资源
	1.先在urls文件中写url与函数的对应关系
	2.再去views文件中写对应的函数
urls.py:路由与视图函数的对应关系
views.py:里面就是放的一堆视图函数(视图函数可以是函数也可以是类)
templates文件夹:里面放的就是一堆html文件(模板文件夹)

动静态网页

静态网页:

数据是写死的,永远不会改变

动态网页:

数据是动态获取的 
	1.获取当前时间
    2.从数据库中获取数据

需求:

1.你给我写一个对应关系 一旦访问立刻展示当前访问的时间

1578047841587

2.后端有一个用户字典 你需要将该字典传递给html页面 并且在该页面上还可以将传递过来的数据当成字典数据进行获取值的操作

1578047899786

jinja2模块

from jinja2 import Template     Template是一个类
pip3 install jinja2
提供一个可以在HTML页面上书写类似于python后端的代码来操作数据(模块语法)

flask框架模板语法使用的就是jinja2模块,所以你只要下了flask框架 就会自动下载jinja2

模板语法(jinja2模板语法非常贴近python语法 但是并不是所有的框架使用的都是jinja模板语法)

{{ xxx }}   {{}}变量相关
	<p>{{xxx.username}}</p>
	<p>{{xxx['password']}}</p>
	<p>{{xxx.get('hobby')}}</p>
	<p>{{xxx.get('hobby')[0]}}</p>
	<p>{{xxx.get('hobby').1}}</p>

1578021417695

{%for user_dict in xxx %}   {% %}逻辑相关
		<tr>
			<td>{{ user_dict.id }}</td>
			<td>{{ user_dict.name }}</td>
			<td>{{ user_dict.hobby }}</td>
		</tr>
	{% endfor %}

for 循环

1578022204148

数据库中展现到前端的页面

1.路由与视图函数对应关系
2.视图函数
3.模板文件夹
4.模板语法(是在后端实现的 前端根本不识别)

web框架

python三大主流web框架

django
	优点:大而全 自身携带的组件和功能特别特别多  就类似于航空母舰
    
	缺点:不足之处:笨重   
		当你的功能不多 不需要使用很多其他功能 
flask(源码600多行  请求上下文 应用上下文)
	优点:小而精 自身携带的组件和功能特别特别少  就类似于游骑兵
	虽然自身功能比较少  但是第三方支持该框架的模块特别特别多
	如果你将flask第三方模块全部叠加起来 甚至可以超过django
    
	缺点:不足之处:受限于第三方模块
tornado
	异步非阻塞
	天然支持高并发 甚至可以用它来开发游戏服务器

1578100042325

django框架

1.注意事项

1.计算机名称不能有中文
2.项目文件名也不要用中文
3.一个pycharm窗口就是一个单独的完整的项目
4.python解释器不要用3.7及以上的版本。(有些功能不兼容)

2.版本问题

1.x版本
2.X版本
推荐你使用1.X版本里面的
	1.11.09~1.11.13
如果你已经按照过不需要手动卸载 重新安会自动先卸载之前的版本再安装

1578024724303

django的安装

pip3 install django==1.11.11

4.测试是否安装成功

命令行输入django-admin

1578024828683

如何创建django项目

1.命令行

1.命令行
	1.创建django项目
		django-admin startproject mysite(项目名)
				

效果:创建一个mysite的文件夹

mysite
	-mysite
		--__init__.py
		--settings.py
		--urls.py
		--wsgi.py
	-manage.py

2.启动django项目(先切换到项目目录下)

方式一:python3 manage.py runserver # django默认的端口号是8000
方式二:python3 manage.py runserver host:prot

3.创建具有独立功能的app 通常情况下应该做到建明制衣

python manage.py startapp app01
	app01
		--migrations文件夹
		--__init__.py
		--admin.py
		--apps.py
		--models.py
		--tests.py
		--views.py

"""
			1.使用命令行创建的django项目是不会自动创建templates摸版本文件夹 你只能自己手动创建
			2.命令行创建的django项目不但没有templates文件夹配置文件中也没有填写路径
				而pycharm创建的会自动添加
"""

2.pycharm快捷创建

application 应用
django其实是一个专注于开发app的web框架
一个空的django项目就类似于是一所大学
app就类似于大学里面的各个学院
每个app其实就类似于不同的功能模块
	购物网站
		用户相关 user
			用户相关的app
		订单相关 order
			订单相关的app
		投诉相关 tousu
			投诉相关的app
不同的功能模块推荐使用不同的app去开发
django支持多app

在启动django项目的时候 你一定要注意确保同一个窗口下只有一个人django项目在启动

注意:

python 解释器版本不要使用3.7版本

推存使用3.4~3.6版本

django主要文件功能

mysite
	-mysite
		--__init__.py
		--settings.py  项目配置文件
		--urls.py      路由视图函数对应关系 项目的总路由
	--wsgi.py      
	-manage.py
	app01
		--migrations文件夹  数据库改动记录
			----__init__.py
		--__init__.py
		--admin.py			django后台管理
		--apps.py			注册app相关
		--models.py         模型类(ORM)
		--tests.py			测试文件
		--views.py          视图函数(******)
	app02
		--migrations文件夹  数据库改动记录
			----__init__.py
		--__init__.py
		--admin.py			django后台管理
		--apps.py			注册app相关
		--models.py         模型类(ORM)
		--tests.py			测试文件
		--views.py          视图函数(******)
	db.sqlite3				django自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)

1578036836531

容易犯的错误

1.代码修改了始终没有效果
2.在同一个端口起了多个服务 一直跑的是最开始的那个服务
3.浏览器缓存问题

1578036845632

创建app之后一定一定要先去setting文件中注册********

django能够自动重启 但是它的重启机制
	只要检测到你的代码有变化 在一定的时间间隔内就会自动重启
	所以有时候可能会出现 你代码还没写完 就已经自动重启了

django小白必会三板斧

from django.shortcuts import  HttpResponse render redirect
HttpResponse ('字符串')
	返回字符串
render
	返回html页面  并且可以给html页面传数据
	模板的渲染(将数据在后端按照模板语法放入html对应的位置)
		
		
redirect
	重定向(原本想访问A但是内部自动给你转到了B上面)

def index(request):  返回一个字符串
		return HttpResponse('你好啊 小妹妹')


	def login(request):
		return render(request,'login.html',{'user_dict':{'username':'jason','password':123},'userxxx':'hello world'})


	def home(request):
		# return redirect('https://www.mzitu.com')
		return redirect('/index')    /index可以是别人网站的全路径,可是自己写的全路径。


原文地址:https://www.cnblogs.com/WQ577098649/p/12150201.html