zoukankan      html  css  js  c++  java
  • django

    HTTP协议:
    四大特性:
    1.基于TCP/IP作用于应用层之上的协议
    2.基于请求响应
    3.无状态
    4.无连接

    数据格式
    请求:
    请求首行GET url HTTP/1.1
    请求头(一大堆k,v的键值对组成)

    请求体

    响应:
    同上


    响应状态码
    1XX:服务器已接收到你的数据正在处理,你可以继续提交数据
    2XX:请求成功,返回相应数据
    3XX:重定向
    4XX:请求不存在(404)
    5XX:服务器错误

    django的运行流程:
    借助于wsgiref模块帮我处理socket以及http消息的处理
      返回字符串
      返回一个html页面
      html页面展示当前时间(html文件r模式打开就是一堆字符串,利用字符串的替换完成后端朝前端html"传输数据")

    借助于jinja2帮我们完成模板渲染(后端给html页面传输数据)
      render()

    模板语法

    {{}} 变量相关
    {%%} 逻辑相关
    {{ data }}
    {{ data.name }}
    {{ data['name'] }}
    {{ data.get('name') }}
    
    {% for user_dict in user_list%} [{},{},{}]
    {{ user_dict }}
    {% endfor %}

    动静态网页区分:
    静态网页:数据是写死的,万年不变
    动态网页:数据是后台动态获取到的,比如数据库的数据


    python三大主流web框架:
      django
      flask
      tronado

    django之如何安装
      1.命令行安装
      pip3 install django==1.11.11
      命令行创建django项目
      django-admin startproject '项目名'
      这样创建出来的django项目只有一个项目文件夹
        __init__
        settings
        urls
        wsgi

      2.manage.pycharm安装
      命令行创建创建app应用
      python manage.py startapp '应用名(app01)'
      命令行启动django项目
      python manage.py runserver


    pycharm安装下
    new project 选django 注意选你的解释器(本机),可以在直接写app名帮你自动创建一个app

    应用下的文件:
      migrations 数据库记录相关
      models.py 数据库模型表(ORM)
      views.py 视图函数(执行相关功能的)

    项目名下文件:
      __init__.py
      settings.py 项目配置文件(欠你们django settings源码)
      urls.py 路由与视图函数的对应关系
      wsgi.py wsgiref相关

    manage.py 项目入口文件

    新手必会三板斧:
      HttpResponse 返回字符串
      render 渲染页面并返回
      redirect 重定向(可以写别人的网址也可以写自己的路由)

    from django.shortcuts import render,HttpResponse,redirect

    app概念:
      一个大学有多个学院
      选课系统(学生 老师 管理员)
      优酷系统(普通用户 会员 管理员)

    前端页面两种引入外部资源的方式:
      1.CDN 内容分发网络
      2.加载本地文件

    html文件夹约定俗成的放在templates文件夹下

    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')]
    ,
    'APP_DIRS': True,
    'OPTIONS': {
    'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    ],
    },
    },
    ]

    约定俗成的静态文件都在放在static文件夹下
    一般情况下static文件夹下建议分成css,js及其他相关文件夹实现分层

    django静态文件配置
    STATIC_URL = '/static/'
    # 静态文件路径配置
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
    ]


    form表单两种提交方式:
      一种是input type=submit
      一种是button按钮

    form表单默认是get请求
    参数携带方式:(url显示)
      http://127.0.0.1:8000/login/?username=jason&password=123
    可以通过method参数指定提交方式

    action三种指定数据提交路径的方式(******)
    1.全路径 :http://127.0.0.1:8000/login/
    2.后缀:/login/(推荐用这种)
    3.不写:不写默认往当前路径提交

    通常情况下视图函数处理的都是get请求

    def login(request):
    # print('收到了')
    # print(request.method)
    if request.method == 'POST':
    # 专门写post请求所对应的逻辑
    return HttpResponse('收到了!')
    # 直接写所有get请求所对应的逻辑
    return render(request, 'login.html')

    get请求和post请求

    django获取前端请求方式:
      request.method


    获取get请求提交的数据
    request.GET 携带了前端所有get请求的数据

    username = request.GET.get('username')
    password = request.GET.get('password')

    取值遵循字典取值 注意虽然它的value是列表但是你取的时候默认取列表最后一个元素


    如果想获取列表里面所有的参数需要用
    getlist() 重点******* 应用场景 checkbox 多选的select框

    (这里有个坑点,在图书管理系统中会遇到取多个作者时要用到)



    ORM
    什么是ORM
    对象关系映射:
      一个类 >>> 数据库的一张表
      类的对象 >>> 数据库的一条记录
      对象点数据(user_obj.name) >>> 数据库某条记录的某个字段值
    优点:
      不会写sql的程序员也能很溜的操作数据库
      大大提高了开发效率
    缺点:
      可能sql语句执行效率不高

    django连接mysql数据库
    1.配置文件注意点:变量名必须全部是大写,否则无效

    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test007',
    'USER':'root',
    'PASSWORD':'123321',
    'HOST':'127.0.0.1',
    'PORT':3306
    }
    }

    2.使用django orm它不会自动帮你创建库,需要你手动创建
    能帮你自动干的事:
    自动帮你创建表

    ******************数据库迁移命令******************(会反复用到这两条命令)

    python manage.py makemigrations 这一句命令只是记录一下数据库更改记录
    python manage.py migrate    真正去操作数据库

    orm查询user表所有数据

    models.User.objects.all()
    orm查询user表的某条数据
    user_queryset = models.User.objects.filter(name=username,password=password)
    只有queryset对象才能够点query获取当前queryset对象所对应的sql语句
    user_obj.query 
    # SELECT
    # `app01_user`.`id`,
    # `app01_user`.`name`,
    # `app01_user`.`password`
    # FROM
    # `app01_user`
    # WHERE
    # ( `app01_user`.`name` = jason AND `app01_user`.`password` = 123 )

    如果想获取对应的模型表对象,需要通过"索引取值"的方式,回去真正的数据对象
    queryset支持正数索引取值,但是不推荐你直接用索引,推荐你用orm给你封装的first()

    user_obj = models.User.objects.filter(name=username,password=password).first()

    只有取出真正的模板表对象,才能通过点的方式操作对应数据库的某条数据(queryset可以不断的筛选)


    表字段的增删改
    ******
    只要动了models.py中涉及表的代码,就必须重新执行数据库迁移命令
    缺一不可,切顺序不可颠倒

    python manage.py makemigrations 这一句命令只是记录一下数据库更改记录
    python manage.py migrate    真正去操作数据库

    表字段的新增

    # 对于已经有数据的表,新增字段的时候,要设置默认值
    addr = models.CharField(max_length=32,default='China')
    # 或者指定该字段可以为空
    phone = models.CharField(max_length=32,null=True)

    user表数据的增删改查
    查:
    后端

    def userlist(request):
    # 查询user表所有数据
    user_queryset = models.User.objects.all()
    return render(request,'userlist.html',{'user_list':user_queryset}) # 前端可以通过user_list拿到对应的数据

    前端

    # 模板语法之for循环 循环展示数据 可以直接敲for tab键自动补全for循环语法
    {% for user_obj in user_list %}
    <tr>
    <td>{{ user_obj.id }}</td>
    <td>{{ user_obj.name }}</td>
    <td>{{ user_obj.password }}</td>
    <td>{{ user_obj.addr }}</td>
    <td class="text-center">
    <a href="/edit_user/?id={{ user_obj.pk }}" class="btn btn-primary btn-sm">编辑</a>
    <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
    </td>
    </tr>
    {% endfor %}

    删:

    def delete_user(request):
    # 获取被删除对象的id
    delete_id = request.GET.get('id')
    # queryset自带delete方法,删除queryset里面所有的数据对象
    # queryset调delete()执行的批量操作 删除的是queryset里面所有的数据
    affect_rows = models.User.objects.filter(id=delete_id).delete()
    print(affect_rows)
    return redirect('/userlist')

    前端

    <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
    增:
    # 方式1:新增数据操作 返回值就是当前被创建对象本身
    # user_obj = models.User.objects.create(name=username,password=password,addr=addr)
    # 方式2:
    # user_obj = models.User(**request.POST)
    # user_obj.save()

    改:
    思路:先获取到底改哪条数据 查询该数据 渲染到前端页面供用户查看及修改
    post请求中获取被修改对象的id两种方式:
    1.input隐藏标签
    2.action携带参数

    <form action="/edit_user/?id={{ edit_obj.pk }}" method="post">
    <input type="hidden" value="{{ edit_obj.pk }}" name="id">
    <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"></p>
    <p>password:<input type="password" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
    <p>addr:<input type="text" name="addr" class="form-control" value="{{ edit_obj.addr }}"></p>
    <input type="submit" class="btn btn-success">
    </form>

    两种修改数据的方式:

    # 修改数据方式1
    models.User.objects.filter(id=id2).update(name=username,password=password,addr=addr)
    # 修改数据方式2
    edit_obj = models.User.objects.filter(id=id2).first()
    edit_obj.name = username
    edit_obj.password = password
    edit_obj.addr = addr
    edit_obj.save()
    只要是queryset对象就可以连续调用queryset对象对应的方法
    models.User.objects.filter().filter().filter().filter().filter()

    查询数据的两种方式

    models.User.objects.filter() 拿到的是queryset对象
    edit_obj = models.User.objects.get(id=edit_id) 拿到的就是数据对象本身(不推荐使用)

    图书管理系统表设计

      书籍 >>> 出版社 一对多(注意:外键说法描述只有一对多,没有多对一)
      作者 >>> 书籍 多对多
      出版社

    一对多

      publish = models.ForeignKey(to='Publish') # 关联publish表 关联字段默认就是主键id

    图书管理系统表相关

    class Book(models.Model):
    # id不写 默认自动就有 指定的话就用你指定的
    name = models.CharField(max_length=32)
    # 小数最多8位 小数部分占两位 999999.99
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # 书籍与出版社是一对多关系 外键字段建在多的一方 orm会自动给这个字段加_id >>>publish_id
    publish = models.ForeignKey(to='Publish') # 关联publish表 关联字段默认就是主键id
    # 多对多外键字段 建议放在使用频率比较高的那张表里 为后期orm查询提供便利
    authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍与作者的关系表 不会在当前表里面创建字段
    
    
    class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()
    addr = models.CharField(max_length=32)
    
    class Author(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
  • 相关阅读:
    网站描述description如何编写
    网站关键词布局设置,这样添加关键词排名很容易上来!
    长尾关键词挖掘工具和使用方法
    小站点如何做好长尾词库(600个长尾词排名的经验分享!)
    如何利用seo技术霸屏你的行业关键词排名
    利用seo技术排名热点新闻词引流(日IP增加2万+)
    yagmail模块的使用
    python--接口自动化
    Python--unittest参数化
    Python--日志模块
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10708315.html
Copyright © 2011-2022 走看看