Django框架(一)

Django框架(一)

手打web框架

# 1.web框架简介
	将前端、数据库整合到一起的基于互联网传输的python代码就可以称之为框架。
    web框架也可以简单的理解为是软件开发架构里面的'服务端'
# 2.搭建简易版本服务端
	1.使用scoket模块
    2.遵循HTTP协议(四大特性、数据格式、响应状态码)
    3.基于不同的后缀响应不同的内容,我们在基于HTTP协议请求数据的时候获取用户输入的URL后缀,/favicon.ico直接忽略,不影响判断,我们可以利用字符切割和索引取值来获取相应的后缀。
# 3.代码演示
import socket

server = socket.socket()
server.bind(('127.0.0.1',8888))
server.listen(5)

while True:
    sock,addr = server.accept()
    data = sock.recv(1024)
    # 将请求相关数据先转成字符串
    data_str = data.decode('utf8')
    sock.send(b'HTTP1.1 200 OK\r\n\r\n')
    # 然后按照空格切割字符串,获取第二个元素就是我们想要的内容
    current_path = data_str.split(' ')[1]
    # 根据不同的后缀返回不同的内容
    if current_path == '/login':
        sock.send(b'this is login')
    elif current_path == '/register':
        sock.send(b'this is register')
    else:
        sock.send(b'this is 404')

基于wsgiref模块

# 1.上述框架的缺陷
	1.服务端起始代码过于重复
    2.针对HTTP请求数据没有完善的处理方式
    3.并发量问题
# 2.利用模块搭建服务端
	1.服务端代码
    from wsgiref import simple_server
    from urls import urls
    from views import error

    def run(request,response):
        """
        :param request: 请求相关的数据
        :param response: 响应相关的数据
        :return: 返回给客户端的展示数据
        """
        response('200 OK',[])  # 固定编写
        current_path = request.get('PATH_INFO')
        func_name = None
        for url_tuple in urls:
            if current_path == url_tuple[0]:
                # 先获取对应的函数名
                func_name = url_tuple[1]
                # 一旦匹配,后续的对应的关系就无须在循环比对
                break
        if func_name:
            res = func_name(request)
        else:
            res = error(request)  # 将request也传给函数,便于后续数据的获取
        return [res.encode('utf8')]

    if __name__ == '__main__':
        server = simple_server.make_server('127.0.0.1',8081,run)
        server.serve_forever()
	2.路由层代码
    from views import *
    urls = (('/login', login),
            ('/register', register),
            ('/big_zi', big_zi))
    3.功能函数代码
    def login(request):
        return 'this is login'
    def register(request):
        return 'this is register'
    def big_zi(request):
        with open(r'dazi.html','r',encoding='utf8') as f:
            return f.read()
    def error(request):
        return 'this is 404'
# 3.优化措施
	因为把所有的代码全部放在一个py文件中显的过于冗余,不便于后期管理,所以我们根据不同的业务逻辑拆分成不同的py文件,路由层(urls.py)存储对应关系,功能函数层(views.py)存储业务逻辑,以后我们想要新增功能,只需要在路由层添加对应关系,功能函数层添加功能函数即可。
    在业务函数代码中,会频繁的使用HTML页面,为了避免文件类型的混乱,单独开设一个文件夹存储所有的HTML文件,templates文件夹存储项目所需的HTML文件,项目中的HTML页面需要用到js,css,第三方框架等等,因为这些写完之后很少做改动,所以统一存放到一个文件夹下,static文件夹,存储项目所需的静态文件。

动静态网页

# 1.静态网页
	页面上的数据是直接写死的,不会改变的
# 2.动态网页
	页面上的数据是通过后端代码动态获取的,实时可变的
# 3.代码演示动态获取时间
	1.后端代码
    def get_time(request):
    # 1.获取当前时间
    import time
    c_time = time.strftime('%Y-%m-%d %X')
    # 2.读取HTML文件
    with open(r'templates/date_time.html','r',encoding='utf8') as f:
        date = f.read()
    # 3.用字符串替换来展示时间
    new_date = date.replace('sadfsd',c_time)
    return new_date
	2.前端代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h2>时间:</h2>
    <span>sadfsd</span>
    </body>
    </html>

jinja2模块

	 jinja2模块是第三方模块,在编写前后端不分离项目的时候,可以使用该模块提供的模板语法简单快速的在HTML页面使用类似于后端的代码语法操作数据
# 代码演示
	1.后端代码
    from jinja2 import Template
    def get_dict(request):
        user_dict = {'name': 'oscar','pwd': 123,'hobby': 'run'}
        new_list = [11,22,33,44,55]
        with open('templates/dict.html','r',encoding='utf8') as f:
            date = f.read()
        temp_obj = Template(date)
        res = temp_obj.render({'user':user_dict,'new_list': new_list})  # 给HTML页面传递一个变量名是user,值是user_dict对应值的数据
        return res
    2.前端代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h2>字典数据展示</h2>
    <p>{{user}}</p>
    <p>{{user.name}}</p>
    <p>{{user['pwd']}}</p>
    <p>{{user.get('hobby')}}</p>
    <p>
        {% for i in new_list %}
        <span>元素:{{i}}</span>
        {% endfor %}
    </p>
    </body>
    </html>

python主流web框架

# 1.django
	大而全,自带功能非常多,但是有时候会略显笨重
# 2.flask
	小而精,自带的功能非常的少,但是第三方模块非常多,flask的第三方模块加起来比Django还多,并且也越来越像Django,flask由于过多的依赖于第三方模块,有时候也会受制于第三方模块
# 3.tornado
	异步非阻塞框架,速度极快,甚至可以用于充当游戏服务器

Django框架简介

# 1.版本问题
	Django3.X:默认支持异步功能
	Django2.X:默认不支持异步
	Django1.X:默认不支持异步
    Django1.11.X LTS在2018年发布,Django2.2X LTS在2020年发布
# 2.启动问题
	1.计算机名称不能含有中文
    2.不同版本的解释器可能会报错,找到报错信息的最后一行提示对应的代码,删除源文件逗号即可,解释器推荐使用python3.6,几乎不会报错,解释器版本过高使用Django1.11可能会报错,解释器版本过低使用Django2、3也可能会报错
    3.项目中所有的文件名称最好都是英文
    4.一个pycharm窗口尽量就是一个完整的项目,不要嵌套

Django基本使用

# 1.验证是否下载成功
	cmd窗口直接输入命令django-admin有反应就是下载成功了
# 2.命令操作Django
	1.创建Django项目
    	django-admin startproject 项目名(mysite)
	2.启动Django项目
    	cd 项目名(mysite)
        python3 manage.py runserver IP:PORT
	3.创建app应用
    	python3 manage.py startapp 应用名(app01)
'''命令操作无法自动创建模板文件夹,需要自己执行命令创建'''
# 3.pycharm操作Django
	1.new project
    	选择Django填写应用即可
  	2.创建更多的app
    	tools
        run manage.py task 命令自动提示
	3.启动项目
    	直接点击绿色箭头
        还可以修改端口号:edit configurations

Django主要文件介绍

	django本身类似于是一个空壳子 真正的功能是由里面的各个应用决定
# 同名文件夹
	settings.py:项目配置文件
	urls.py:路由层
# 其他文件
manage.py:Django入口文件,很多命令都需要改文件
db.sqlite3:Django启动之后才会生成的文件,相当于Django自带的小型数据库
templates文件夹:模板层,存放HTML页面代码
# app应用文件夹
	migrations文件夹:数据迁移记录
	admin.py:django自带的后台管理
	apps.py:用于app的注册
	models.py:专门用于操作数据库
	views.py:视图层
'''
创建应用之后一定要去配置文件中注册才能生效:
	'app01.apps.App01Config':完整语法
	'app01':简写语法						
'''

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-10 22:26  陆禄绯  阅读(33)  评论(0编辑  收藏  举报