django静态文件相关配置、请求方法、链接mysql以及django的ORM

静态文件及相关配置

准备

  • 先创建django项目并创建一个app
image-20220831161849256
  • 在urls.py中添加一组对应关系

image-20220831162145244

  • 在app的views.py中编写核心逻辑代码
  • 利用三板斧与前端做交互(HttpResponse、render、redirect)
from app01 import models
def home(request):
    if request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        obj=models.User.objects.filter(name=username,pwd=password)
        if obj:
            return HttpResponse('登录成功')
        return HttpResponse('用户名或者密码错误')
    return render(request,'login.html')

image

这样一个简单的登录页面就做好了

静态文件

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

  • 第三方框架文件
  • css文件
  • js文件
  • 图片文件

我们在项目根目录下创建一个名叫static的文件夹,并将这些静态文件资源放进这个文件夹。

当static目录下出现了很多不同类型的静态文件资源,那么还可以分类管理

  • others文件夹:第三方框架文件
  • css文件夹:所有的css文件
  • js文件夹:所有的js文件
  • img文件夹:所有的img文件

开设静态资源访问接口

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

理论上应该自己去路由层开设接口资源,但是由于静态资源使用频率很高,只要是一个web项目都肯定需要,所以django为了避免繁琐,提供了静态资源的配置文件只需要填写固定的配置即可开设资源接口

配置文件

# settings.py

#127行
STATIC_URL='/static/'  # 接口前缀:表示具备访问静态资源的权限
# 在STATIC_URL后加入下面一行代码
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]  # 为什么是列表:用来存放多个静态文件夹路径

STATIC_URL='/static/'中的static是接口前缀,表示具备访问静态文件资源的权限,具备了权限之后会拿着接口前缀后面的文件路径去列表中的每个文件夹中查找(页面访问静态文件)。找到一个就结束,比如static和static1里面都有a.txt,那么只会拿到static里面的a.txt就结束,html页面显示的是static的a.txt。

动态解析

<!--以导入bootstrap为例-->

{% load static%}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}">

接口前缀与静态文件夹名称区别

接口前缀是访问静态文件资源的前提,符合前提之后才可以去列表中罗列的路径下一次查找具体文件

请求方法

GET请求

定义:朝别人索要数据

get请求也可以携带额外的数据

image-20220831174057160

上述携带数据的方式有两个限制

  1. 数据只能是一些无关紧要的非敏感数据
  2. 数据大小有限制:2KB-4KB左右

GET请求没有请求体(HTTP数据格式)

POST请求

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

补充

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

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

method='post'   # 数据提交方式为POST

提交post请求时,默认会报403错误,前期我们不需要考虑太多,直接去配置文件中注释一行即可

image-20220831171424700

request对象方法

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

pycharm链接mysql

  1. 查找pycharm提供的database按钮,左下角或右侧边栏,如果没有的话重新下载插件或者重装
  2. 首次连接数据库需要下载对应的驱动
  3. 功能较少,但能实现简单的增删改查

django链接mysql

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

配置文件中修改配置

在settings修改配置

# settings  将原来的数据库配置改成如下
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db01',        # 数据库库名
        'HOST': '127.0.0.1',   # ip地址
        'PORT': 3306,          # 端口
        'USER': 'root',        # 用户名
        'PASSWORD': '123456',  # 密码
        'CHARSET': 'utf8'      # 字符编码
    }
}

指定链接mysql的模块

django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码

import pymysql
pymysql.install_as_MySQLdb()

django2.2 以上版本需要使用mysqlclient模块

django orm

ORM:对象关系映射

类            映射成    表
对象          映射成    记录
对象点属性     映射成    字段对应的值

ORM的存在可以让不会mysql的python程序员,使用python的语法简单快捷的操作mysql。但是ORM的过度封装sql语句效率有时并不高,有时还需要认为去优化。

操作流程

  • 先去应用目录下的models.py编写模型类
from django.db import models
class User(models.Model):                # 类似于定义了表名
  # id int primary key auto_increment
  id=models.AutoField(primary_key=True)  # 类似于定义了主键
  # name varchar(32)
  name=models.CharField(max_length=32)   # 类似于定义了普通字段
  # pwd int
  pwd=models.IntegerField()              # 类似于定义了普通字段
  • 数据库迁移/同步命令
# 将models中有关数据库的操作记录下来(migrations文件夹)
python3.8 manage.py makemigrations

# 将数据同步到数据库(真正影响到数据库)
python3.8 manage.py migrate

当修改了models中与数据库相关的代码,都必须执行上述的命令。可以简写,也可以指定引用单独迁移,同步。

补充

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

orm语法

models.User.objects.filter()  # 结果可以看成是一个列表套数据对象

user_obj = models.User.objects.filter()[0]  # 如果获取不到数据就会报错

orm为我们提供了first()方法,如果没有值会返回None,我们if判断即可

models.User.objects.filter()
user_obj = models.User.objects.filter(username='jason',pwd=123).first() 
if user_obj:
  return HttpResonse('登录成功')
return HttpResonse('用户名或密码错误')

models.User.objects.create()  # 括号内填写字段及数据

models.User.objects.create(username='jason',pwd=123)

# mysql:insert into user(username,pwd)values('jason',123)

models.User.objects.filter(id=1).update(name='jasonNB')  # filter()不写的话,默认整张表name字段的数据全改为jasonNB

# mysql:update user set name='jasonNB' where id=1

models.User.objects.filter(id=1).delete()  # filter()不写默认整张表的数据全部删除

# mysql:delete from user where id=1;

orm外键关联

mysql外键创建

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

orm外键创建

一对多:外键字段建立在多的一方
多对多:外键字段可以直接写在某张表中,orm会自定创建第三张中间表
一对一:外键字段建立在查询频率较高的表中

class Book(models.Model):
    name=models.CharField(max_length=32)
    # 书籍和出版社的关系为一对多,出版社为一:id会根据publish加上_id的后缀作为外键id
    publish=models.ForeignKey(to='Publish',on_delete=models.CASCADE)  
    
    # 书籍和作者的关系为多对多:会自动创建一个中间表
    author=models.ManyToManyField(to='Author')  

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


class Author(models.Model):
    name=models.CharField(max_length=32)
    
    # 作者和作者详细的关系为一对一:会自动根据detail加上_id作为外键id
    detail=models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
class AuthorDetail(models.Model):
    addr=models.CharField(max_length=64)
posted @ 2022-08-31 18:53  荀飞  阅读(103)  评论(0编辑  收藏  举报