zoukankan      html  css  js  c++  java
  • Django

    软件开发架构

    cs架构
    bs架构
    # 本质bs也是cs

    HTTP

    # HTTP协议
    '''
    网络协议
    HTTP协议                数据传输是明文
    HTTPS协议                数据传输是密文
    websocket协议             数据传输是密文
    
    HTTP协议的四大特性:
        1、基于请求响应
        2、基于TCP/IP,作用域应用层之上的协议
        3、无状态
        4、短/无链接
    数据格式:
        请求首行(HTTP协议版本 请求方式)        响应首行(HTTP协议版本 状态码)
        请求头(一堆的k:v键值对)              响应头(一堆的k:v键值对)
        
        请求体(向服务器提交的数据)            响应体(展示给用户看的数据)
    响应状态码
        1xx:服务器接收数据正在处理,可继续提交其他数据
        2xx:响应成功 200 OK
        3xx:请求重定向
        4xx:页面请求错误 (403 404, 请求不合法,请求资源不存在)
        5xx:服务器内部错误 (500)
    '''

    纯手撸web框架

    # 你可以将web框架理解成服务端
    import socket
    
    
    server = socket.socket()  # TCP  三次握手四次挥手  osi七层
    server.bind(('127.0.0.1',8080))  # IP协议 以太网协议 arp协议...
    server.listen(5)  # 池 ...
    
    """
    b'GET / HTTP/1.1
    
    Host: 127.0.0.1:8082
    
    Connection: keep-alive
    
    Upgrade-Insecure-Requests: 1
    
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 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;q=0.9
    
    Sec-Fetch-Site: none
    
    Sec-Fetch-Mode: navigate
    
    Sec-Fetch-User: ?1
    
    Sec-Fetch-Dest: document
    
    Accept-Encoding: gzip, deflate, br
    
    Accept-Language: zh-CN,zh;q=0.9
    
    Cookie: csrftoken=KYJnVBLPpJxwt09TOmTXzpb5qkFJwHVxVGpi0NxEGIg4z5VUuazZ1O2RMwSisu14
    
    
    '
    """
    
    while True:
        conn, addr = server.accept()
        data = conn.recv(1024)
        # print(data)  # 二进制数据
        data = data.decode('utf-8')  # 字符串
        # 获取字符串中特定的内容       正则  如果字符串有规律也可以考虑用切割
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        current_path = data.split(' ')[1] # 获取到用户输入的网址后缀
        # print(current_path)
        if current_path == '/index':
            # conn.send(b'index heiheihei')
            with open(r'templates/01 myhtml.html', 'rb') as f:
                conn.send(f.read())
        elif current_path == '/login':
            conn.send(b'login')
        else:
            # 直接忽略favicon.ico
            conn.send(b'hello web')
        conn.close()
    
       
    '''
    纯手写的不足之处:
        1、服务端代码重复性高
        2、手动处理http格式数据,只能拿到url后缀,想获取其他数据较为繁琐
        3、并发问题

    借助于wsgiref模块

    """
    urls.py                路由与视图函数对应关系
    views.py               视图函数(后端业务逻辑)
    templates文件夹         专门用来存储html文件
    """
    # 按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系然后取views.py书写逻辑即可

    动静态网页

    """
    静态网页
        页面上的数据是直接写死的 万年不变
    动态网页
        数据是实时获取的
        
    """
    
    # 动态网页制作
    import datetime
    def get_time(env):
        current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
        # 如何将后端获取到的数据"传递"给html文件?
        with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
            data = f.read()
            # data就是一堆字符串
        data = data.replace('dwadasdsadsadasdas',current_time)   # 在后端将html页面处理好之后再返回给前端
        return data
    
    # 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
    from jinja2 import Template
    def get_dict(env):
        user_dic = {'username':'jason','age':18,'hobby':'read'}
        with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
            data = f.read()
        tmp = Template(data)
        res = tmp.render(user=user_dic)
        # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
        return res
    
    # 后端获取数据库中数据展示到前端页面

    模版语法之Jinja2模块

    模块安装: pip3 install jinja2

    """模版语法是在后端起作用的"""
    
    # 模版语法
    {{ user }}
    {{ user.get('username')}}
    {{ user.age }}
    {{ user['hobby'] }}
    
    
    {% for user_dict in user_list %}
                            <tr>
                                <td>{{ user_dict.id}}</td>
                                <td>{{ user_dict.username}}</td>
                                <td>{{ user_dict.password}}</td>
                                <td>{{ user_dict.hobby}}</td>
                            </tr>
    {% endfor%}

    python三大主流web框架

    """
    django
        特点:大而全 自带的功能特别特别特别的多 类似于航空母舰
        不足之处:
            有时候过于笨重
    
    flask
        特点:小而精  自带的功能特别特别特别的少 类似于游骑兵
        第三方的模块特别特别特别的多,如果将flask第三方的模块加起来完全可以盖过django
        并且也越来越像django
        不足之处:
            比较依赖于第三方的开发者
            
    tornado
        特点:异步非阻塞 支持高并发
            
       
    """
    A:socket部分
    B:路由与视图函数对应关系(路由匹配)
    C:模版语法
    
    django
        A用的是别人的        wsgiref模块
      B用的是自己的
      C用的是自己的(没有jinja2好用 但是也很方便)
    
    flask
        A用的是别人的        werkzeug(内部还是wsgiref模块)
      B自己写的
      C用的别人的(jinja2)
    
    tornado
        A,B,C都是自己写的

    注意事项

    # 如何让你的计算机能够正常的启动django项目
      1.计算机的名称不能有中文
      2.一个pycharm窗口只开一个项目
      3.项目里面所有的文件也尽量不要出现中文
      4.python解释器尽量使用3.4~3.6之间的版本
         # django安装
        pip3 install django==1.11.11
      
      验证是否安装成功的方式1
          终端输入django-admin看看有没有反应
       或者 Python文件导入

    django基本操作

    # 命令行操作
        # 1.创建django项目
          
          django-admin startproject mysite
        
            # 2.启动django项目
        """
        先切换到项目目录下    
           
        """
      python3 manage.py runserver
     
    # 3.创建应用
    """
    Next, start your first app by running python manage.py startapp [app_label].
    """
    python manage.py startapp 项目名
    eg: python manage.py startapp app01



    # pycharm操作 # 1 new project # 2 启动 1.命令行启动 python manage.py runserver 2.点击绿色小箭头即可 # 3 创建应用 pycharm提供的终端直接输入完整命令 python3 manage.py startapp app01(文件名) # 4 修改端口号以及创建server edit confi....

    应用

    """
    django是一款专门用来开发app的web框架
    
    """
    ***********************创建的应用配置文件中注册**********************
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',  # 全写
          'app01',             # 简写
    ]

    ***********************************************************************

    主要文件介绍

    -mysite项目文件夹
        --mysite文件夹
          ---settings.py    配置文件
        ---urls.py            路由与视图函数对应关系(路由层)
        ---wsgi.py            wsgiref模块
      --manage.py                django的入口文件
      --db.sqlite3            django自带的sqlite3数据库(小型数据库)
      --app01文件夹
          ---admin.py            django后台管理
        ---apps.py            注册使用
        ---migrations文件夹        数据库迁移记录
        ---models.py        数据库相关的 模型类(orm)
          ---tests.py            测试文件
        ---views.py            视图函数(视图层)

    命令行与pycharm创建的区别

    # 1 命令行创建不会自动有templatew文件夹 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
    # pycharm创建
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
    ]
    # 命令行创建
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
    ]
    

    django三板斧

    """
    HttpResponse
        返回字符串类型的数据
    
    render
        返回html文件的
    
    redirect
        重定向
          return redirect('https://www.mzitu.com/')
        return redirect('/home/')
    """
  • 相关阅读:
    idea 团队成员修改工程后push推送
    clone克隆远程库工程到本地
    idea本地工程项目push推送到远程库
    Android中使用ViewGroup.removeViews()时出现NullPointException解决方案
    Android项目的targetSDK>=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题
    C#-Xamarin的Android项目开发(三)——发布、部署、打包
    defineProperty 和Proxy双向绑定演示,你还不知道么?
    2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?
    三面拿杭州研究院50offer:面对这些问题,你都能做到嘛??
    ROS 机器人技术
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/12961155.html
Copyright © 2011-2022 走看看