静态文件相关配置、request请求方法、pycharm连接MySQL、django连接MySQL、orm

静态文件及相关配置

1.编写一个登录功能

1.创建django项目并创建一个app
2.在urls.py添加一组对应关系
3.在app的views.py中编写登录核心逻辑
4.利用三板斧与前端做交互

image

image

image

2.为什么我们可以访问一个网址看到一些资源?

    (自己理解:是因为我们提前把这个资源写好了,我们在使用django框架的时候是因为我们在urls文件里将要用到的资源都提前写好了,才能够访问到,如果没有写的话就没法访问)

    我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口

image

image

3.静态文件资源

html页面上使用的不经常修改的资源

1.第三方框架文件
2.css文件
    所有的css文件
3.js文件
    所有的js文件
4.图片文件
    所有的img文件

争对静态文件资源我们一般放在static文件夹内

这个文件夹就按这个名字来设置不要进行修改

如果这个文件夹内又出现了好多文件,然后有好多js文件好多css文件,那么在这种情况下也可以进行对他们再次创建不同的文件夹进行管理,同样如果一个同样后缀的文件夹里又有许多不同功能的文件,也可以继续进行文件夹划分管理
		'合理精细化管理'

image

找不到我们所引入的bootstrap的css与js文件

为什么找不到??
    一定要注意: '我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口' 细品这句话,我们并没有开设响应的接口,相当于我们直接将网址输入浏览器的输入栏里中,我们用了django框架,那么在访问一些资源得到数据的时候必须是我们提前设置好的,这些数据别人可以拿到这些资源

image

image
所以我们在配置了前端的静态文件以后还的配置相应的接口,提前配好,才能访问得到资源

针对静态文件资源的访问也需要提前开设相应的接口

在settings文件下最底部,文件本身自带有提示,设置静态文件的接口
image

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'
# 静态文件资源配置(固定的)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
    # 在导入这些文件的时候,不需要跳级,只需要/static/...
]

俩个static有什么不同?

# /static/bootstrap-3.4.1-dist/js/bootstrap.min.js   1


STATIC_URL = '/static/'   # 2  叫做接口前缀
# 静态文件资源配置(固定的)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')  # 3
    # 在导入这些文件的时候,不需要跳级,只需要/static/...
]
'''
1参照的是2,它们俩是一致的,一旦接口前缀写对以后,1后面是一个完整的路劲,然后就会拿着这个整个路劲去3里面查找有没有对应的这个文件,
1和2不是那个我们建立的文件夹static,它就是一个标识,就是(bootstrap-3.4.1-dist/js/bootstrap.min.js)的一个前缀,1与2一致后,才会去识别到我们建立的那个static文件夹里查找是否存在这个文件
'''

那么为什么STATICFILES_DIRS对应的是一个列表?

列表,可以存放许多个数据
首先先看前俩个static是否一致,然后再拿着接口后面的文件路劲去资源配置里查找,里面存放着不同的文件夹,然后挨个进行比对查找,如果没有的话就会报404错误

一个极端的问题:动态解析解决

有好多Html文件都需要用到bootstrap源码,然后突然想改接口前缀,所有页面就睡失效,那怎么做呢?
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">

image
image

请求方法

1.GET请求

向别人索要数据,也可以携带额外的数据,在url后面加?后面跟上携带的数据
    url?xxx=yyy&zzz=ooo&aaa=bbb
携带数据的限制:
    1.数据只能是一些无关紧要的非敏感数据
    2.数据大小有限制 2kb-4kb左右
GET请求没有请求体(HTTP数据格式)

2.POST请求

朝别人提交数据,也可以携带额外的数据,数据都是放在请求体中,并且数据大小没有限制

3.form表单默认的数据提交方式是GET

method = 'post'
action 控制数据的提交地址
方式1:朝当前页面所在的地址提交
方式2:写后缀 /index/ 自动补全ip和port
方式3:写全称https://www.baidu.com

4.提交post请求前期需要去配置文件中注释一行代码

MIDDLEWARE = [
    # 'django.middleware.csrf.CsrfViewMiddleware',
]

request对象方法

点击查看代码
from django.http import HttpResponse
from django.shortcuts import render


# Create your views here.
def login(request):
    '''该函数将来会通过不同的请求方式触发 并且需要执行不同的业务逻辑代码'''
    # print(request.method)
    if request.method == 'GET':
        # 1.返回给前端一个页面,
        return render(request, 'login.html')
    elif request.method == 'POST':
        print(request.POST)  # <QueryDict: {'username': ['Jason'], 'password': ['123']}>
        res = request.POST.get('username')
        print(res, type(res))  # 如果一个列表中有多个数据的时候,返回的是最后一个数据 kerry <class 'str'>
        # Jason <class 'str'>
        '''
        虽然看起来是一个列表,但是我们获取到的是一个字符串
        [31/Aug/2022 18:50:51] "GET /login/ HTTP/1.1" 200 1152
        [31/Aug/2022 18:51:05] "POST /login/ HTTP/1.1" 200 9
        <QueryDict: {'username': ['Jason', 'tony', 'kerry'], 'password': ['123']}>
        kerry <class 'str'>
        如果一个列表中有多个数据的时候,返回的是最后一个数据
        '''
        res1 = request.POST.getlist('username')   # 如果你想那那个键对应的所有的值,就可以使用另一个方法,getlist
        print(request.GET)  # 只要在网址后面加的数据,无论发什么请求,都可以通过request.GET拿到这个数据
        return HttpResponse('收到了')


'''
[31/Aug/2022 18:35:10] "GET /login/ HTTP/1.1" 200 966
<QueryDict: {'username': ['Jason'], 'password': ['123']}>

:知识点小插曲:
    在写表单的时候,我们会写一个name的属性,如果不写的话就不会获取到它的数据
[31/Aug/2022 18:35:19] "POST /login/ HTTP/1.1" 200 9
'''

image

request.method	获取请求方式 结果是纯大写的字符串
request.POST  	获取POST请求发送来的普通数据(不包含文件)
    request.POST.get()     默认只获取列表中最后一个数据值
    request.POST.getlist()  获取键对应的整个列表 无论有几个数据值
request.GET	   获取url后面携带的非敏感数据
    request.GET.get()     默认只获取列表中最后一个数据值
    request.GET.getlist()  获取键对应的整个列表 无论有几个数据值

image

pycharm连接MySQL

1.查找pycharm提供的database按钮

右侧边栏或者左下角有一个数据据的小图标
image
如果没有的话就去下载

Files--->settings--->plugins,然后搜索Database Tools and sql

image

image
下载安装驱动
image
连接已有的数据库
image
添加新的数据
image
一些常用的功能
image

2.首次链接数据库需要下载对应的驱动

image

django链接MySQL

django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少

1.配置文件中修改配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 指定数据库软件名称
        'NAME': 'day55',  # 指定库名
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}

2.报错处理

1.django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
    在__init__.py中添加下面俩句话
        import pymysql
        pymysql.install_as_MySQLdb()
2.AttributeError: 'str' object has no attribute 'decode'

3.指定链接MySQL的模块

django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
    import pymysql
    pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块,不需要在__init.py文件中添加那俩句代码

django orm

ORM:对象关系映射

类			映射成				表
对象			映射成				记录
对象点属性 		映射成				字段对应的值
"""
ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
"""

image

1.先去应用目录下的models.py编写模型类

点击查看代码
from django.db import models

# Create your models here.
class User(models.Model):  # 类似于定义了表名
    # 原生sql语句,id int primary key auto_increment
    id = models.AutoField(primary_key=True)  # 类似定义了主键
    # 原生sql语句,name varchar(32)
    name = models.CharField(max_length=32)  # 定义了一个name字段
    # 原生sql语句,pwd int
    pwd = models.IntegerField()  # 类似于定义了一个pwd的整形字段

2.数据库迁移/同步命令

1.将models中有关数据库的操作记录下来(migrations文件夹)
    python38 manage.py makemigrations
2.将操作真正影响到数据库中
    python38 manage.py migrate
    '''当修改了models中与数据库相关的代码 都必须执行上述的命令'''
    ps:可以简写 也可以指定应用单独迁移/同步

在终端输入python38 manage.py makemigrations,会在在migrations文件夹中出现一个0001——initial.py文件,里面会记录我们想要创价的模型

点击查看代码
# Generated by Django 2.2.22 on 2022-08-31 12:23

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(primary_key=True, serialize=False)),
                ('name', models.CharField(max_length=32)),
                ('pwd', models.IntegerField()),
            ],
        ),
    ]

python38 manage.py migrate

image

django会嵌入很多的应用,一个应用就是一个具体的业务逻辑,可能会出现不同的应用应用相同的表名,不同的应用建立了相同的表名,那么此时的orm直接将我们建立的模型名作为表明的话就会发生冲突,所以它自动加了一个前缀

image

3.orm会自动添加一个id的主键

表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键,如果你需要主键的名称不叫id 只能自己创建

orm语法

1.查
    models.User.objects.filter()  结果可以看成是一个列表套数据对象
    如何获取对象 可以使用first()方法 如果没有值会返回None 我们if判断即可
2.增
    models.User.objects.create()
3.改
    models.User.objects.filter(id=1).update(name='jasonNB')
4.删
    models.User.objects.filter(id=4).delete()
点击查看代码
from django.http import HttpResponse
from django.shortcuts import render
from app01 import models

# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 删除数据
        # models.User.objects.filter(id=5).delete()
        # 修改数据
        # models.User.objects.filter(id=1).update(name='jasonNB')
        # 增加数据
        # models.User.objects.create(name=username,pwd=password)
        # 查询表数据
        # select * from user where name='' and pwd=''
        # user_obj = models.User.objects.filter(name=username, pwd=password).first()
        # print(res)  # <QuerySet [<User: User object (1)>]> 列表套数据对象
        # user_obj = res[0]
        # if user_obj:
        #     print(user_obj.id)  # 1
        #     print(user_obj.name)  # jason
        #     print(user_obj.pwd)  # 123
        #     return HttpResponse('登录成功')
        # return HttpResponse("用户名或密码错误")
    return render(request, 'login.html')

orm外键关联

MySQL
    一对多
    	外键字段建在多的一方
    多对多
    	外键字段建在第三张关系表
    一对一
    	外键字段建在查询频率较高的表中

ORM
    一对多
    	外键字段建在多的一方
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    多对多
    	外键字段可以直接写在某张表中 orm会自动帮你创建第三张表
    authors = models.ManyToManyField(to='Authors')
   一对一
    	外键字段建在查询频率较高的表中
    detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)

image
多对多的关系
image
不需要自己画蛇添足的加id,orm会自己加,即使你加了它还会加一个
image

点击查看代码
class Book(models.Model):
    title = models.CharField(max_length=32)
    # 书与出版社是一对多 书是多
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
    # 书与作者是多对多
    authors = models.ManyToManyField(to='Authors')

class Publish(models.Model):
    pub_name = models.CharField(max_length=32)


class Authors(models.Model):
    name = models.CharField(max_length=32)
    # 一对一关系,建立在使用频率高的一边
    detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    phone = models.BinaryField()
posted @ 2022-08-31 21:58  张张包~  阅读(107)  评论(0编辑  收藏  举报