后端框架django

Posted wq577098649

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端框架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.你给我写一个对应关系 一旦访问立刻展示当前访问的时间

技术图片

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

技术图片

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>

技术图片

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

for 循环

技术图片

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

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

web框架

python三大主流web框架

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

技术图片

django框架

1.注意事项

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

2.版本问题

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

技术图片

django的安装

pip3 install django==1.11.11

4.测试是否安装成功

命令行输入django-admin

技术图片

如何创建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自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)

技术图片

容易犯的错误

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

技术图片

创建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可以是别人网站的全路径,可是自己写的全路径。

以上是关于后端框架django的主要内容,如果未能解决你的问题,请参考以下文章

后端框架django

django框架——十

django框架——十

django是前端还是后端

django是前端还是后端

后端框架对比:Flask与Django