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仓库https://search.maven.org/search?q=mysql-connector-java-搜索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)
    

猜你喜欢

转载自www.cnblogs.com/zhangtieshan/p/12961826.html
今日推荐