zoukankan      html  css  js  c++  java
  • request对象的方法, pymysql, django orm

    静态文件配置

    • 视图函数都必须有返回值, 并且返回值都是HttpResponse对象

    • 默认情况下, 所有的html文件都是放在templates文件夹内

    • 用户在浏览器中输入网址能访问到对应的资源, 前提是后端提前开设了该资源的访问接口

    • 静态文件: 网站所使用到的提前写好的css, js, 第三方前端模块, 图片等都叫做静态资源

      默认情况下, 网站所用到的静态文件全部会放在static文件夹下,

      通常情况下会在static文件夹内再建立文件夹对不同静态文件加以区分,

      例如: css文件夹, js文件夹, font文件夹等,

      django中, 需要自己手动创建静态文件存放的文件夹

    • 禁止浏览器使用缓存: f12-->...-->Settings-->Network-->Disable cache

    STATIC_URL = '/static/'  # 访问静态资源文件接口前缀
    # STATIC_URL = '/xxx/'
    STATICFILES_DIRS = [  # 静态资源所在文件夹路径
        os.path.join(BASE_DIR, 'static'),  # 将static文件里的所有资源上线到服务器
        os.path.join(BASE_DIR, 'static1')
    ]
    
    # <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    
    • 动态绑定静态文件, 映射关系: 多<==>一<==>一

      多: 动态变化的url后缀, 一: 文件夹路径, 一: 模板语法内置的static变量

          {% load static %}
          <script src="{% static 'jQuery.3.4.1.js' %}"></script>
          <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
        <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
      

    request对象的方法

    form表单默认是get请求

    • get请求也能够携带参数

      • http://127.0.0.1:8000/login/?username=cql&password=123
      • 格式: url?xxx=xxx&yyy=yyy
    • get请求携带参数特点:

      1. 携带数据不安全
      2. 携带的数据大小有限制
      3. 通常只会携带一些不是很重要的数据
    • 在朝后端提交post请求出现403时, 需要去配置文件中注释掉一行内容,

      MIDDLEWARE-->'django.middleware.csrf.CsrfViewMiddleware', 中间件

    • 浏览器无论发get请求还是post请求, 都会执行django后端的视图函数

      • get请求, 获取login页面
      • post请求, 提交数据, 然后后端做校验
    • 获取前端请求方式: request.method, 大写的字符串

    • 获取用户提交的post请求的数据: request.POST, 相当于字典

      '''
          print(request.POST)  # <QueryDict: {'username': ['cql'], 'password': ['123']}>
          username = request.POST.get('username')
          password = request.POST.get('password')
          print(username, type(username))  # cql <class 'str'>
          print(password, type(password))  # 123 <class 'str'>
          
          username_lt = request.POST.getlist('username')
          print(username_lt, type(username_lt))  # ['cql'] <class 'list'>
          
          用get取值, 默认只取列表最后一个元素, 如果想获取列表, 需使用getlist
          
      '''
      
    • 获取用户提交的get请求的数据: request.GET, 更细粒度获取数据: request.GET.get, request.GET.getlist

    django连接数据库

    文件配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 指定数据库类型
            'NAME': 'django',  # 指定库的名字
            'USER': 'root',  # 键必须是全大写
            'PASSWORD': 'Cql123456',
            'HOST': '127.0.1.1',
            'PORT': 3306,
            'CHARSET': 'utf8'
        }
    }
    

    设置不用默认的mysqldb连接, 而是用pymysql连接

    在项目名或者在应用名下的__inint__中书写代码指定

    import pymysql
    
    pymysql.install_as_MySQLdb()
    

    django orm

    orm优点: 能够让不会数据库操作的人也能够简单方便的操作数据库

    orm缺点: 封装程度太高, 会出现查询效率低的问题

    django中如何操作orm

    • 去models.py中书写模型类

      from django.db import models
      
      
      class User(models.Model):
          id = models.AutoField(primary_key=True)  # 当不指定主键时, django会自动创建一个名为id的主键字段
          username = models.CharField(max_length=32)  # CharField字段必须指定max_length参数 
          password = models.CharField(max_length=64)
      
    • 一个django项目对应一个数据库

    • 数据库迁移(同步)命令

      • python manage.py makemigrations, 将数据库的修改记录到app中的migrations文件夹内,类似于日志
      • python manage.py migrate, 将修改操作真正同步到数据库中
      • 自动加前缀区分(app01_user), 第一次自动创建默认功能表
      • 只要修改了models里面和数据库相关的代码, 就必须重新执行上面两条命令

    字段的增删改查

    • 增加新字段

      '''
      email = models.EmailField()
      
      python manage.py makemigrations
      报错: without a default  # 未设置默认值
      解决:	
      	1) Provide a one-off default now  # 在cmd中直接提供默认值
      	2) Quit, and let me add a default in models.py  
      	# 在models对应的表类中设置默认值或允许为空, email = models.EmailFieldnull=True)
      
      '''
      
    • 删除字段: 在models对应的表类中直接注释掉对应的字段代码, 然后执行数据库迁移命令(谨慎使用)

    完善登录功能

    django orm 查询数据库中数据

    def login(request):
        if request.method == "POST":
            username = request.POST.get('username')
            password = request.POST.get('password')
    
            # 数据库查询数据, 结果为列表套数据对象, 可以用多个and关系的关键字参数查询
            data = models.User.objects.filter(username=username)
    
            if not data:
                return HttpResponse('当前用户不存在!')
    
            user_obj = data[0]
            if user_obj.password == password:
                return HttpResponse('登录成功!')
            return HttpResponse('密码错误!')
    
        return render(request, 'login.html')
    

    展示 + 新增用户功能

    django orm 新增数据库中数据

    '''
    1. 查询数据库中的所有数据展示到前端页面
    2. 前端页面上针对不同的数据都有编辑和删除按钮
    3. 点击对应的按钮能完成对应的操作
    '''  
    def show_user_lt(request):
        user_lt = models.User.objects.all()  # 等价于: models.User.objects.filter()
        return render(request, 'show_user_lt.html', {'userLt': user_lt})
    
    
    def add_user(request):
        # 草稿: 给用户返回一个添加页面, 然后用户输入提交, 后端获取数据, 写入数据库, 并给重定向到数据展示页
    
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            
            # create新增数据方法返回值为当前被创建的对象本身
            user_obj = models.User.objects.create(username=username, password=password)  
            # print(user_obj, user_obj.username, user_obj.password)
    
            return redirect('/show_user_lt/')  # 添加成功后跳转到数据展示页
    
        return render(request, 'add_user.html')
    
    
    class User(models.Model):
        username = models.CharField(max_length=32)
        
        # 跟数据库没有关系, 所以不需要执行数据库迁移命令
        def __str__(self):
            return self.username  # 该返回值必须是字符串类型
    

    编辑 + 删除用户功能

    模板语法的注释

    {# {% endfor %}#}, 不会展示到前端, html的注释会展示到前端

    django orm 修改数据库中数据

    def edit_user(request):
        """
        草稿:
            返回一个编辑页面, 该页面上应该展示想要编辑的用户信息
            利用get请求携带参数的方式, 获取用户想要编辑的数据的id值
            将用户想要编辑的数据查询出来, 展示到编辑页面上, 供用户修改
        """
        edit_id = request.GET.get('edit_id')
        edit_obj = models.User.objects.filter(id=edit_id).first()  # 不推荐索引取值
    
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
    
            # 修改数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部更新
            models.User.objects.filter(id=edit_id).update(username=username, password=password)
    
            return redirect('/show_user_lt/')
    
        return render(request, 'edit_user.html', {'edit_obj': edit_obj})
    
    <!--在show_user_lt页面中通过模板语法为每条数据的编辑按钮设置不同的get请求携带参数-->
    <tbody>
        {% for user_obj in userLt %}
        <tr>
            <td>
                <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn">编辑</a>
            </td>
        </tr>
        {% endfor %}
    </tbody>
    

    django orm 修改数据库中数据

    def delete_user(request):
        delete_id = request.GET.get('delete_id')
    
        # 删除数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部删除
        models.User.objects.filter(id=delete_id).delete()
    
        return redirect('/show_user_lt/')
    
  • 相关阅读:
    大话设计模式笔记 装饰模式
    大话设计模式笔记 依赖倒转原则
    大话设计模式笔记 单一职责原则 开放-封闭原则
    Effective Java 英文 第二版 读书笔记 Item 5:Avoid creating unnecessary objects.
    Effective Java 英文 第二版 读书笔记 Item 4:Attempting to enforce noninstantiability by making a class abstract does not work.
    Effective Java 英文 第二版 读书笔记 Item 3:Enforce the singleton property with a private constructor or an enum type.
    Effective Java 英文 第二版 读书笔记 Item 2:Consider a builder when faced with many constructor parameters.
    大话设计模式笔记 策略模式
    大话设计模式笔记 简单工厂模式
    jvm的垃圾回收算法
  • 原文地址:https://www.cnblogs.com/-406454833/p/11970172.html
Copyright © 2011-2022 走看看