• day60——静态文件配置、request对象、链接数据库、ORM


    今日内容:

    以登陆功能为例

    1. 静态文件配置
    2. request对象方法初始
    3. pycharm链接数据库(MySQL)
    4. Django链接数据库(MySQL)
    5. Django ORM简介
    6. 利用ORM实现数据的增删改查操作

    静态文件配置

    什么是静态文件

    前端已经写好了的,能够直接调用的文件就可以称之为静态文件,如:

    • 网站写好的js文件
    • 网址写好的css文件
    • 网址用到的图片文件
    • 网页渲染所需的第三方框架(bootstrap)

    django中静态文件

    • 将网址所用的静态文件默认都放在static文件夹下
    • 在创建Django项目时是不会自动的创建static静态文件的,需要手动创建
    • Ps:我们将html文件默认都放在templates文件夹下
    • 一般情况下我们在static文件夹内还会做进一步的划分处理,如:
      • js
      • css
      • img
      • 其他第三方文件
    """
    在浏览器中输入url能够看到对应的资源
    是因为后端提前开设了该资源的接口
    如果访问不到资源 说明后端没有开设该资源的接口
    """
    

    静态文件配置

    上述说道浏览器要想访问到对应的资源的话,后端必须开设该资源的接口,同样浏览器访问静态文件也是如此,但是如果说我们静态文件非常多的话,都去开设接口就非常的麻烦,我们可以在settings文件中添加静态文件配置。

    步骤:去到项目同名文件夹下找到settings.py配置文件,下拉文件到最后,在最后的STATIC_URL = '/static/' 下书写配置,配置代码:

    STATIC_URL = '/static/'  # 类似于访问静态文件的令牌
    STATICFILES_DIRS =[
        os.path.join(BASE_DIR,'static'),
        #os.path.join(BASE_DIR,'static1'),
        #os.path.join(BASE_DIR,'static2'),
    ] 
    """
    STATICFILES_DIRS为一个列表,意味着可以放多个文件夹路径,
    假设访问为http://127.0.0.1:8000/static/a.txt
    如果访问的令牌/static/正确会在配置列表中从各个文件夹内依次查找a.txt,返回先查到的文件,都查不到就报错"""
    

    配置完后html文件中导入的路径前加上/static/即可

    静态文件动态解析

    上述的配置“令牌”必须是STATIC_URL = '/static/' 如果修改令牌,或者说不等于'/static/',我们在html中导入的路径就不会生效,因为我们写死了令牌必须是/static/ ,如果能够实现动态的解析文件的路径?

    可以将html导入文件的代码写成下面的形式:

    # 原本的导入css文件代码
    <link rel="stylesheet" href="../static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    
    # 动态解析路径代码
    {%load static%}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    

    这样就配置文件中的令牌不管怎么修改,静态文件配置都能生效

    后端代码修改之后前端没有变化解决办法

    问题:当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况

    解决办法:

    1. 你可能在同一个端口开了好几个django项目,一直在跑的其实是第一个django项目,关掉之前开的其他django项目
    2. 浏览器缓存的问题,右键打开检查,找到settings配置,点进去在network下将disable cache勾选上,如图:

    from表单提交数据

    form表单的没有指定method的时候,提交的数据会用问号将数据拼接到url后面,这是因为form默认的请求方式是GET请求,但是密码属于重要的信息,GET请求这样提交数据不安全,需将form表单的请求方式改为POST请求,method="POST"

    修改method再次提交数据会报错,如图:

    解决办法:在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',  # 注释掉这样代码,再次提交数据就以POST请求提交数据
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    请求方式有GET和POS两种,如何做到根据不同的请求方式在视图函数中做不同的处理,然后返回呢?

    这就需要用到request对象了


    request对象方法初始

    • request.method :返回请求的方式,为全大写的字符串形式<class 'str'>
    • request.POST :返回post请求提交的普通数据,是一个字典的形式,key对应值为列表注意不包括文件
    • request.POST.get() :只返回值列表中的最后一个元素
    • request.POST.getlist() :返回这个key对应值的列表
    • request.FET request.GET.get() request.GET.getlist() :与POST请求相同

    ps:get请求携带的数据是有大小限制的,而post请求没有限制

    用以上的request方法实现根据请求的不同,视图函数做不同的处理:

    # views.py中的视图函数login
    
    def login(request):
        # 第一种书写方式,判断两者请求方式
        # if request.method == 'GET':
        #     print('GET请求来了')
        #     return render(request,'login.html')
        # elif request.method == 'POST':
        #     print('POST请求来了')
        #     return HttpResponse("也收到了数据")
        
        # 第二种书写方式,只判断POST请求,做处理;GET请求直接返回对应的页面
        if request.method == 'POST':
            return HttpResponse("也收到了数据")
        return render(request, 'login.html')
    

    后端能够获取用户提交的登录数据之后,还需要进一步的对数据进行校验,判断是否登录成功,也就是说需要用到数据库了


    pythcharm链接数据库(MySQL)

    pycharm可以充当很多款数据库软件的客户端

    pycharm中查找数据库功能

    • 右侧上方database

    • 左下方database

    • 配置里面的plugins插件搜索安装,默认是安装好的

    • 不行就卸载pycharm重装

    连接数据库

    一定要先下载数据库的驱动

    如果下载驱动报错如下图:

    解决办法,去 mvent仓库搜索mysql-connector-java下载jar文件,手动导入驱动:具体操作参考下面连接

    下载mysql驱动报错解决办法

    注意:链接前需要将库提前创建好


    django链接数据库(MySQL)

    django默认使用的是自己的小型数据库sqlite3,默认的配置为:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    

    django链接MySQL需修改配置

    1. 在项目同名文件下的settings配置文件中修改配置,配置代码如下:

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',  # 只需将后缀改成msyql即可
              'NAME': 'day60',  # 库名
              'USER':'root',  # 用户名
              'PASSWORD':'666666',  # 密码
              'HOST':'127.0.0.1',  # ip
              'PORT':3306,  # MySQL端口
              'CHARSET':'utf8'  # 编码
          }
      }
      

      上述修改配置配置后如果立即重启django项目,启动不了会报错

      """
      django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'.
      """
      
      

      是因为django默认用的是mysqldb模块链接mysql的,该模块的兼容性不好,需要我们手动的改为pymysql链接

    2. 代码声明

      需要用代码声明告诉django不要用默认的mysqldb,改为用pymysql链接

      # 在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以
      import pymysql
      pymysql.install_as_MySQLdb()
      

      声明后就能正常启动项目了


    Django ROM

    简介

    ORM:对象关系映射

    映射关系:

    <——>
    对象 <——> 记录
    对象属性 <——> 记录某个字段对应的值

    作用:能够让一个不会sql语句的小白也能够通过python面向对象的代码简单快捷的操作数据库

    不足:封装程度太高,有时候sql 语句的效率偏低,需要直接写sql语句

    创建ROM

    • 去应用(app01)下面的models.py文件中书写一个类

      class User(models.Model):
          # id int primary_key auto_increment
          id = models.AutoField(primary_key=True)
          # username varchar(32)
          username = models.CharField(max_length=32)
          # password int
          password = models.IntegerField()
      
    • 在terminal窗口中执行两条数据库迁移命令

      1. 将操作记录写到migrations文件夹中

        python3 manage.py makemigrations  
        

      2. 将操作真正的同步到数据库中

        python3 manage.py migrate
        

      注意:上述两条命令非常重要,只要修改了models.pyt中跟数据库相关的代码,就必须重新的执行这两条命令

    其他注意事项:

    class User(models.Model):
        id = models.AutoField(primary_key=True,verbose_name='主键')
        username = models.CharField(max_length=32,verbose_name='用户名')
        """
        CharField必须要指定max_length参数 不指定会直接报错
        verbose_name该参数是所有字段都有的 就是用来对字段的解释
        """
        password = models.IntegerField(verbose_name='密码')
    
    
    class Author(models.Model):
        # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
        # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
        # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写,主键不叫id的情况需自己写
        username = models.CharField(max_length=32)
        password = models.IntegerField()
    

    ORM实现字段的增删改查

    • 增加字段

      如果表中也有记录,添加字段时,也有的记录需要在新的字段对应一个值,有三种方法

      1. 在终端terminal中输入python3 manage.py makemigrations数据库命令时,按提示选第一个选项直接给出默认值

      2. 在models.py文件中添加字段时,括号里设定值可以为空

        info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
        
      3. 在models.py文件中添加字段时,直接给字段设置默认值

        hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
        
    • 修改字段

      直接在models.py文件中修改字段对应的代码,然后执行数据库迁移命令即可

    • 删除字段

      直接注释对应的字段然后执行数据库迁移的两条命令即可!

      注意:删除字段的时候千万要细心,因为如果执行数据库迁移命令之后字段对应的数据也都没有了,千万不要随意的注释字段,执行迁移命令之前最好先检查一下自己写的代码。

      Ps:建议人走屏锁,当你离开你的计算机之后一定要锁屏,避免不必要的麻烦,锁屏快捷键windows+L

    数据的增删改查

    视图函数中需要导入models.py文件,form app01 import models

    • 查数据

      res = models.User.objects.filter(username=username)
      """
      1.res的值可以看成是列表套数据对象的格式:[数据对象1,数据对象2,...]
      2.它支持索引取值,切片操作,但是不支持负数索引
      3.虽热支持索引取值但是他不推荐,推荐使用.方法()取值,
      	user_obj = models.objects.filter(username=username).first()
      4.filter括号内可以携带多个参数,参数与参数建默认是and关系,可以将filter联想成数据库操作where记忆"""
      
    • 增加数据

      # 第一种增加方式
      res = models.User.objects.create(username=username,password=password)
      # 返回值就是当前被创建的对象本身
      
      # 第二种增加方式
      user_obj = models.User(username,password=password)
      user_obj.save()
      
  • 相关阅读:
    vue-cli 3.0 路由懒加载
    vue 路由拦截、axios请求拦截
    vue-cli 3.0 图片路径问题(何时使用 public 文件夹)
    vue 监听页面宽度变化 和 键盘事件
    WGS84、GCJ-02(火星坐标)、百度坐标,Web墨卡托坐标
    Java学习之道:Java项目打包发布
    ora-14550问题解决
    费氏搜寻法之算法分析与实现
    [置顶] woff格式字体怎么打开和编辑?
    C++小知识之Vector排序
  • 原文地址:https://www.cnblogs.com/zhangtieshan/p/12961826.html
Copyright © 2020-2023  润新知