django框架-1

纯纯手撸web框架

web框架可以简单的理解为是基于互联网的web服务端>>>:socket服务端****
image

    1.socket服务端代码
    2.HTTP协议
    3.根据网址后缀的不同请求不同的内容
    4.请求方式
        GET:朝服务端索要数据
        POST:朝服务端提交数据
    5.从请求数据格式中筛选出用户输入的网址后缀
    	target_url = data.decode('utf8').split(' ')[1]
    6.代码的缺陷
        1.下述十行socket代码重复编写
        2.针对请求数据格式的处理复杂且重复
        3.针对不同网址后缀的匹配方式过于简单  提现不出你的水平呀

import socket

server = socket.socket()  # TCP协议
server.bind(('127.0.0.1', 8080))  # IP协议 PORT协议
server.listen(5)  # 半连接池 缓冲

while True:
    sock, address = server.accept()
    data = sock.recv(1024)
    sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
    print(data.decode('utf8'))  # 从字符串中截取出需要的内容
    target_url = data.decode('utf8').split(' ')[1]  # / /index /login /reg /xxx
    if target_url == '/index':
        sock.send(b'index view')
    elif target_url == '/login':
        sock.send(b'login view')
    elif target_url == '/reg':
        sock.send(b'reg view')
    else:
        sock.send(b'404 error')

基于wsgiref模块撸

wsgiref内部封装了socket代码和对请求数据的处理  转换成字典K:V键值对形式
    from wsgiref.simple_server import make_server


    def run(request, response):
        """

        :param request:请求数据
        :param response: 响应数据
        :return: 返回客户端的数据
        """
        print(request)  # 自动将请求数据全部处理成字典K:V键值对形式
        response('200 OK', [])  # 固定代码
        return [b'hello curry']


    if __name__ == '__main__':
        server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会给第二个参数加括号调用
        server.serve_forever()  # 永久服务启动

解决了两个问题:
    1.下述十行socket代码重复编写
    2.针对请求数据格式的处理复杂且重复

image

思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
	先从大字典中查找出记录网址后缀的键值对
	1.不推荐使用连续的多个if判断
	2.针对面条版的代码首先应该考虑封装成函数
    
def index(request):
    return 'index'


def login(request):
    return 'login'


def register(request):
    return 'register'


def error(request):
    return '404 error'


urls = (
    ('/index', index),
    ('/login', login),
    ('/register', register),
)
    func_name = None
    for url_tuple in urls:
        if url_tuple[0] == target_path:
            func_name = url_tuple[1]  # 先存储匹配到的函数名
            break  # 一旦匹配到了内容就立刻关闭for循环
    # for循环结束之后还需要判断func_name是不是为None(有可能没匹配上)
    if func_name:
        res = func_name(request)
    else:
        res = error(request)
    return [res.encode('utf8')]  # 统一做编码处理 这样函数就只需要返回字符串即可

根据py文件中功能的不同划分到不同的py文件(模块化)

文件 功能
view.py 功能函数
start.py 启动文件
templates文件夹 存储html
urls.py 对应关系

动静态网页

动态网页
	网页上的数据不是全部写死的 有些是动态获取(后端传入的)
静态网页
	页面上的数据是直接写死的 要想改变只能修改源码
    
实际需求
    后端代码回去当前时间  然后让前端页面展示
    1.字符串替换
    2.将字典数据传递给html页面并且想要在页面上操作字典数据
    	我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据

jinja2

jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
pip3 install jinja2


from jinja2 import Template
def get_dict(request):
    user_dict = {'name': 'curry', 'pwd': 666, 'hobby': ['basketball']}
    with open(r'templates/myhtml04.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
    return res

image

模板语法

可以在mysql中增删在前端显示 正式将前端、Web框架、mysql数据库连接起来,不然只是独立的个体

<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 

{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}

python主流web框架

django框架
	大而全 自身携带的功能非常的多 类似于航空母舰
		缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
    
flask框架
	小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
    	缺陷:受限于第三方模块的开发
   
tornado框架
	异步非阻塞 该框架快到可以作为游戏服务器
    	缺陷:上手难度是三者最高的
            
FastAPI框架
	应该用于构建API的现代,快速(高性能)的 web 框架,使用Python 3.6+ 并基于标准的 Python 类型提示。
    
Sanic框架
    是一个基于Python3.5+的web框架,依托于uvloop、asyncio等事件循环和异步并发模块,旨在提供支持异步高并发请求的web服务
    
'''框架虽然多但是内部逻辑差不多 我们重点学习一个即可>>>:django'''

django框架简介

1.版本问题
	1.X:同步		1.11
 	2.X:同步		2.2   
  	3.X:异步		3.2
ps:你无论使用什么版本都可以 区别不大 2.2
    
2.启动注意事项
	1.计算机名称尽量不要有中文
 	2.项目中所有的py文件名尽量不要用中文
 	3.不同版本的python解释器配合不同版本的django 会有一些报错
    	仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
       找到那一行代码 把逗号删除即可
    		widgets.py  152  
  	4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

3.验证django是否下载成功
	cmd终端输入django-admin

image

django基本操作命令

命令行操作
	1.创建django项目
    	django-admin startproject 项目名
 	2.启动django项目
		1.先切换到项目目录下
		cd 项目名
       2.执行启动目录
    		 python38 manage.py runserver ip:port
 	3.访问django服务端
    	浏览器直接访问
 	4.创建app应用
    	"""
    	django框架类似于是一个空壳子 给你提供所需的资源
    	至于到底要写哪些功能 需要通过创建app来划分
			eg:django初始项目可以看成是一所大学
			app就相当于是大学里面的各个学院
    	"""
       python38 manage.py startapp 应用名
pycharm操作
	鼠标点点即可
"""
在启动django项目的时候 一定要确保一个端口只有一个项目
"""

命令行与pycharm操作的区别

1.命令行不会自动创建templates文件夹
2.命令行不会在配置文件编写关于templates文件夹的配置
	'DIRS': [os.path.join(BASE_DIR, 'templates')]
3.pycharm自动创建的第一个应用会自动注册到配置文件中
4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来

django目录结构

django项目目录
	项目同名文件夹
	__init__.py  	很少用 主要做一些冷门配置
	settings.py     项目配置文件
	urls.py		    对应关系(目前简单的理解:网址后缀跟函数名)
	wsgi.py		    django服务 基本不用
	manage.py		django入口文件
	templates文件夹  存储项目所需的html文件
   
应用名文件夹(可以有多个)
	migrations文件夹   orm相关(数据库打交道的记录)
	__init__.py  	  很少用 主要做一些冷门配置
	admin.py		  django自带的后台管理
	apps.py			  创建应用之后用于应用的注册
	models.py		  存储与数据库表相关的类
	tests.py		  自带的测试文件
	views.py		  存储业务相关的逻辑代码(函数、类)
	db.sqlite3	      自带的小型数据库

urls.py		路由层
views.py	视图层
templates	模板层
models.py   模型层

django小白必会三板斧

HttpResponse
	主要用于直接返回字符串类型的数据
render
	主要用于返回html页面 并且支持模板语法
redirect
	主要用于页面重定向

8.30小练习

1.简述可迭代对象,迭代器对象,生成器对象及应用场景
    迭代器对象就是实现了iter()next()方法的对象.其中iter()返回迭代器本身,next()返回容器的下一个元素,在结尾处引发StopInteration异常.
    迭代器对象是一边循环一边计算的机制
    可迭代对象是可以直接作用于for循环 包括以下2种:1.listtuplesetdictstr等集合数据类型和生成器

2.什么是元类?元类的应用场景有哪些,能具体说说吗?
	元类是创建类的类  元类可以应用于日志记录, 创建时注册类以及进行概要分析。

3.你用的MySQL是哪个引擎,各个引擎之间有什么区别
    1.MyISAM
    MySQL5.5及之前版本默认的存储引擎
    存取数据的速度快 但是功能较少 安全性较低
    2.InnoDB
    MySQL5.5之后版本默认的存储引擎
    存取数据的速度没有MyISAM快 但是支持事务、行锁、外键等诸多功能 
    安全性较高
    3.Memory
    基于内存的存储引擎 存取数据极快 但是断电立刻丢失
    4.BlackHole
    黑洞 任何写进去的数据都会立刻丢失 类似于垃圾站

4.什么是Js,Js的数据类型有哪些,Js序列化反序列化用的是什么方法
	1.整数型
    2.小数型
    3.数组型
    4.布尔值
    5.对象
    6.自定义对象
    
    即将JS对象序列化为字符串
    即将字符串序列化为JS对象
posted @   初学者-11  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示