zoukankan      html  css  js  c++  java
  • Django学习之路

    基础web框架的实现

    1.纯手撸web框架。

      1、手动书写socket代码

      2、手动处理http数据

    #socket套接字
    import socket
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    
    while True:
        conn, addr = server.accept()
        data = conn.recv(1024)
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        # print(data)
        data = data.decode('utf-8')
        current_path = data.split('
    ')[0].split(' ')[1]
        # print(current_path)
        if current_path == '/index':
            # conn.send(b'index')
            with open(r'D:python脱产10期视频day511 纯手撸html文件.html','rb') as f:
                conn.send(f.read())
        elif current_path == '/login':
            conn.send(b'login')
        else:
            conn.send(b'hello world!')
        conn.close()
    #类型转换
    data = b'hello world'
    
    data = str(data,encoding='utf-8')
    print(data)
    
    data = bytes(data,encoding='utf-8')
    print(data)

    2.基于wsgiref模块帮助我们处理scoket以及http数据

      wsgiref模块

        1、请求来的时候,解析http数据,帮你打包成一个字典传输给你,便于你操作各项数据。

        2、响应走的时候,自动帮你把数据再打包成符合http协议格式的样子,再返回给前端

    def run(env,response):
        """
        env是请求相关的数据
        response是响应相关的数据
        """
        # print(env)
        response('200 OK',[])
        current_path = env.get('PATH_INFO')
        # print(current_path)
        # if current_path == '/index':
        #     return [b'index']
        # elif current_path == '/login':
        #     return [b'login']
        # 定义一个存储函数名的标志位
        func = None
        for url in urls:
            # 判断当前url在不在元组内
            if url[0] == current_path:
                # 只要匹配上了  就把url后缀对应的函数名赋值给func
                func = url[1]
                # 一旦匹配上 应该立刻退出for循环 节省资源
                break
        # 对变量func做判断
        if func:
            res = func(env)
        else:
            res = errors(env)
        return [res.encode('utf-8')]
    
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1',8080,run)
        # 实时监测127.0.0.1:8080地址 一旦有客户端来连接 会自动加括号调用run方法
        server.serve_forever()  # 启动服务端

    3.封装路由与视图数对应关系,以及视图函数文件,网站用到的所有html文件全部放在了templates文件夹下

      1、urls.py路由与视图函数对应关系

      2、views.py视图函数(视图函数不单单指函数,也可以是类)

      3、templates模板文件夹

    #urls
    from 代码.views import *
    
    urls = [
        ('/index',index),
        ('/login',login),
        ('/reg',reg),
        ('/get_time',get_time),
        ('/get_user',get_user),
        ('/get_db',get_db),
    ]
    #views
    def index(env):
        return 'index'
    def login(env):
        return 'login'
    def errors(env):
        return '404 error'
    
    def reg(env):
        return 'reg'
    
    from datetime import datetime
    
    
    def get_time(env):
        # 借助于时间模块 现在后端获取到时间数据
        current_time = datetime.now().strftime('%Y-%m-%d %X')
        with open(r'templates/02 get_time.html','r',encoding='utf-8') as f:
            data = f.read()  # data其实就是一串字符串  仅此而已!!!
        data = data.replace('$$time$$',current_time)
        return data
    
    
    
    from jinja2 import Template
    def get_user(env):
        user_dict = {'username':'jason','password':'123','hobby':['read','game','running']}
        with open(r'templates/03 get_user.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)
        res =  temp.render(data = user_dict)  # 将user_dict传递给前端页面 前端页面通过变量名data就能够获取到该字典
        return res
    
    import pymysql
    def get_db(env):
        conn = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            user = 'root',
            password = '123',
            database = 'day51',
            charset = 'utf8',
            autocommit = True
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        sql = "select * from userinfo"
        affect_rows = cursor.execute(sql)
        data = cursor.fetchall()
        # print(data)
        with open(r'templates/04 get_db.html','r',encoding='utf-8') as f:
            data1 = f.read()
        temp = Template(data1)
        res = temp.render(user_list= data)
        return res

    4.基于jinja2实现模板的渲染

      模板的渲染

        后端生成好数据,通过某种方式传递给前端页面使用(前端页面可以基于语法更加快捷简便使用后端传过来的数据)

    python三大主流web框架介绍和分析

    1.Django:大而全 自带的功能特别特别多 就类似于航空母舰 有时候过于笨重

    2.Flask:短小精悍 自带的功能特别特别少 全都是依赖于第三方组件,flask框架第三方的组件特别多,如果把flask第三方全部加起来 完全可以盖过Django,比较受限于第三方的开发者

    3.Tornado:天生的异步非阻塞框架 速度特别快 能够抗住高并发,可以开发游戏服务器

    A:socket
    B:路由与视图函数匹配
    C:模板语法

    Django
           A:用的别人的 wsgiref
           B:自己写的
           C:自己写的
    Flask
           A:用的别人的 wsgiref>>> werkzeug
           B:自己写的
           C:用的别人的 jinja2
    Tornado
           A,B,C全都是自己写的

    Django的使用

    """
    版本问题:
    django版本问题1.x和2.x(本次以1.11.11为学习对象)
    注意事项:
        1.你的计算机的名称不能有中文
        2.文件的命名尽量也不要用中文
        3.一个pycharm窗口只能有一个项目 不要把多个项目放在一个窗口下
    """

    Django的下载与安装

    #django下载
    #命令行内敲:
        pip3 install django==1.11.11
    #确认是否下载成功
    #命令行内敲:
        django-admin

    Django的项目创建

    命令行式

      1.命令行创建django项目

        django-admin startproject 项目名

      2.命令行内创建django应用(一个应用对应一块独立的功能)

        django-admin startapp 应用名

        python manage.py startapp 应用名

      3.命令行启动django项目

        python manage.py runserver

    注意 :用命令行创建django项目 不会自动新建templates模板文件夹,需要你自己手动创建 并且需要你自己去settings.py文件中注册该文件路径

    pycharm快捷方式

    创建Django项目

    创建Django项目

    一:

     二:

     

    (******)
    创建的应用一定要在settings中注册 才能生效 否则无法识别

     如果没有配置temlates路径也要手动添加

    启动django项目

     Django创建完成后的页面

     django的主要文件夹介绍

    项目名文件
      同名的项目文件夹
        settings.py django暴露给用户可配置的文件
        urls.py 路由与视图函数对应关系
      manage.py django入口文件
      应用文件夹
        migrations文件夹 数据库迁移记录
        admin.py django后台管理
        apps.py 应用注册相关
        models.py orm模型类
        tests.py 测试文件
        views.py 视图函数

    Django基础必备三件套:

    from django.shortcuts import HttpResponse, render, redirect

    HttpResponse

    内部传入一个字符串参数,返回给浏览器。

    例如:

    def index(request): # 业务逻辑代码 return HttpResponse("OK")

    render

    除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

    将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)

    例如:

    def index(request): # 业务逻辑代码 return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

    redirect

    接受一个URL参数,表示跳转到指定的URL(重定向)。

    例如:

    def index(request): # 业务逻辑代码 return redirect("/home/")
  • 相关阅读:
    oss blob上传
    app中画一条细线
    antd和原生交互,原生掉前端的方法
    -webkit-touch-callout 图片下载
    ifram嵌入网址 有跨域问题
    ...state
    数组对象的复制
    在vue中使用tinymce组件
    autofs自动挂载服务
    podmen
  • 原文地址:https://www.cnblogs.com/wangnanfei/p/11514976.html
Copyright © 2011-2022 走看看