Welcome to kimi's blog

django连接MySQL

django连接MySQL

静态文件配置修改

静态文件配置

1.编写一个用户登录页面

login.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="../static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>

<div>
    <div class="container">
        <div class="row">
            <h1 class="text-center">用户登录</h1>
            <div class="col-md-8 col-md-offset-w">
                <form action="">
                    <p>username:
                        <input type="text" class="form-control">
                    </p>
                    <p>password:
                         <input type="text" class="form-control">
                    </p>
                    <input type="submit" class="btn btn-success btn-block" value="用户登录">
                </form>
            </div>
        </div>
    </div>
</div>

2.静态文件

​ 不怎么经常变化的文件,主要针对html文件所使用到的各种资源,比如css文件、js文件、img文件、第三方框架文件

​ django针对静态文件资源需要单独开一个目录统一存放在static目录

static目录   该目录下类型文件居多可再分
	css目录
	js目录
	img目录
	utils目录/plugins目录/libs目录/others目录/不创

3.资源访问

​ 我们在地址栏之所以可以输入路由获取到相应的资源登录资源,是因为程序员提前开设了资源的接口,比如在网址输入http://127.0.0.1:8000/admin,就能访问相应的接口资源

![开设好的接口资源]
image

4.静态文件资源访问

​ 直接引入css和js,是不能直接使用动态效果的,要静态文件配置添加,添加了bootstrap之前要添加jquery.

​ 默认情况下无法访问的,是因为我们没有提前开设静态文件资源的访问接口,如图下所示

image

login能请求成功是浏览器朝这个网址http://127.0.0.1:8000/login/,这个后端已经开设了访问端口;而请求 URL:

http://127.0.0.1:8000/static/bootstrap-3.4.1-dist/css/bootstrap.min.css 是在自己的浏览器朝这个网址请求资源,但是后端没有开设端口,所以访问不到资源

如何解决?

理论我们应该在urls填写相应的关系,但是静态文件太多了,所以django专门为静态文件开设了一个static文件资源接口

静态文件相关配置

1.如何配置静态文件配置?

​ 首先在settings里面找到最后面STATIC_URL = '/static/',在下面配置static所以资源的路径,

STATIC_URL = '/static/'
STATICFILES_DIRS= [
    os.path.join(BASE_DIR,'static')
]
相当于把static路径添加了环境变量中

但是要注意的点是要把网页里面的..去除掉

静态文件配置1

2.接口前缀

STATIC_URL = '/static/'  # 访问静态文件资源的接口前缀(通行证)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 存储静态文件资源的目录名称
    os.path.join(BASE_DIR, 'static1'),  # 存储静态文件资源的目录名称
    os.path.join(BASE_DIR, 'static2'),  # 存储静态文件资源的目录名称
]

"""接口前缀正确之后 会拿着后面的路径依次去到列表中自上而下查找 一旦找到就返回"""

查找顺序 :

接口前缀>>>接口资源文件(自上而下,找到就截止),接口前缀对了才有资格访问接口文件资源

要是想切换接口前缀呢?

有时候就浏览器会请求临时缓存内容发送我们,我们不可能一个一个去改static,太麻烦了,我们直接动态获取

3.接口前缀动态匹配

静态文件配置
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
<script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>

如果我们想改接口前缀的话,我需要把上面静态文件配置改为下面的模板语法(可动态获取)

django提供的模板语法{% load static %},相对于模块。
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>

每次想改接口前缀,直接在settings将STATIC_URL = '/static/'修改为updateStatic或者别的,django自动会我们动态匹配的,如下图

image

form表单

action      控制数据提交的地址
	1.action=""  数据默认提交当前页面所在的地址
    2.action="https://www.baidu.com/"  完整网址
    3.action="/index"  朝当前服务端的index地址提交

method      控制数据提交的方法
	1.get    默认
    2.post    可以改post  method="post"
    form表单默认get请求  , 朝浏览器发送请求会是敏感数据,要换成post请求,mothed=post
    

请求方法补充

1.get请求 :朝服务端索要数据,也可以携带一些额外的要求。

​ 携带额外数据方式:URL?xxx=yyy&uuu=zzz,但是问号后面携带的数据大小是有限制的(2-8kb),并且不能携带敏感数据(密码)

2.post请求: 朝服务端提交数据

​ 携带额外数据的方式:请求体,请求体携带数据安全性较高并且没有大小的限制。

​ 前期发送post请求需要注释掉配置文件中的某一行

method="post"
MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

​ get与post请求如下

image

form表单要注意的点

1.关于请求方法

2.获取用户标签要加name属性,不加name属性是填写不了

3.修改settings里面的配置

image

request对象方法

理解

request={WSGIReques} <WSGIRequest: GET '/login/'>
两层封装,第一层wsi封装了大字典,第二层是django封装成了方法,返回给我们的是里面含有很多方法

request请求结果

请求方法 描述 结果
request.method 结果是纯大写的字符串数据 GET/POST
request.POST 获取post请求请求体里面携带的数据
request.POST.get() 获取列表最后的一个数据值
request.POST.getlist() 获得整个列表数据
request.GET 获取网址问号后面携带的数据值
request.GET.get() 获取列表最后的一个数据值
request.GET.getlist() 获得整个列表数据
代码展示
def login(request):
    """
    如果get请求直接返回html页面
    如果是post请求,那么需要获取发送过来的数据
    :param request:
    :return:
    """
    print(request.GET)
    if request.method=='GET':
        # 1.返回html页面
        # print(request.method)  # / GET/POST
        return render(request,'login.html')
    elif request.method=='POST':
        #2.获取post请求体里面的数据
        print(request.POST)   # <QueryDict: {'kimi': ['kimi'], 'pwd': ['123']}>
        name=request.POST.get('name')  # 获取列表最后一个数据值
        pwd=request.POST.get('pwd')
        print(name,type(name),pwd,type(pwd))  # kimi <class 'str'> 123 <class 'str'>
        name1=request.POST.getlist('name')
        print(name1,type(name1))  # ['kimi'] <class 'list'>
        return HttpResponse('数据我收到了')
在视图函数中针对不同的请求代码编写套路
	if request.method == 'POST':
		return HttpResponse()
	return HttpResponse()


代码展示:

django连接数据类

pycharm连接MySql

1,pycharm初次连接数据库,都要下载相应的驱动,驱动不行就换驱动,验证的话就是登录用户名(端口和地址) 库名,验证登录就用test connection

三个位置查找数据库相关
	1.右侧上方database
	2.左下方database
	3.配置里面的plugins插件搜索安装
注意:	
	都没有再没有卸载pycharm重新装	

image

2.登录管理员账户和密码,连接你需要的数据库(库要提前创建好),在连接之前可以先点击Test Connection 测试连接是一次。注意:在公司不能是管理员的用户登录的!

image

3.成功连接成功

image

django连接MySql

django自带的sqlite3是一个小型的数据库,功能比较少,主要是用于本地测试。实际项目都会替换它的

1.修改配置文件中数据库设置成django连接MySQL

django配置文件中默认的是sqlite3数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

django连接MySQL要修改上述配置
1.第一配置文件中配置
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',   # 修改成MySQL数据库
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),   # 连接数据库名称 先创建好才能指定
        'ENGINE': 'django.db.backends.mysql',   # 修改成MySQL数据库
        'NAME': 'djangodb1',   # 连接数据库名称 先创建好才能指定
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8'
    }
}
 注意,左边的名字都要大写!!!!

2.手动改动将默认mysqldb改为pymysql
django默认用的是mysqldb模块链接MySQL, 但是该模块的兼容性不好 需要手动改为用pymysql链接,需要指定模块

​ 2.1 django1.X版本需要在项目目录下或者app目录下的__init__.py编写代码

import pymysql
pymysql.install_as_MySQLdb()

​ 2.2 django2.X及以上都可以直接通过下载mysqlclient模块解决

pip3.8 install mysqlclient

​ ps:该模块windows下载问题不大 主要是mac电脑可能有问题

校验用户登录代码:

def login(request):
        if request.method=='POST':
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        #现阶段:后端获取到的前端数据,一般都是字符串
        if name == 'kimi' and pwd == '123':
            return HttpResponse('用户登录成功')
        return HttpResponse('用户名或者密码错误')
    return render(request,'login.html')

django ORM简介

ORM:对象关系映射

​ 优点:它能够让不会SQL语句的python程序员,使用python面向对象的语法来操作数据库。

​ 缺点:封装程度太高,有时候sql语句的效率偏低,徐娅自己写SQL语句。

类             表
对象           一条条数据
对象点名字     数据获取字段对应的值

基本ORM操作(数据的迁移)

1.在models.py中编写模型类

class User(models.Model)
	# 字段名=字段类型+约束条件
    # id int primary_key auto_increment
    id=models.AutoField(primary_key=True)
    # username varchar(32)  # CharField必须要加max_length参数,不加报错
    name=models.CharField(max_length=32)
    # password int
    age=models.IntegerField()

2.执行数据库迁移相关命令

打开terminal输入命令

# 数据库迁移
python38 manage.by makemigrations   将操作记录到小本本上(migrations)
# 数据库同步到数据库中
python38 manage.py migrate    将操作同步到数据库上

注意:每次在models.py修改了与数据库相关的代码,都需要在执行上述命令

image

关于数据库迁移失败的原因
1.一个数据库尽量只对应一个django项目
2.多个Django使用一个数据库,极易容易报错

ORM基本语句

from app01 import models
models.类名.objects.create()
models.类名.objects.filter()
models.类名.objects.update()
models.类名.objects.delete()

django OPM实现基本的增删改查
    if request.method=='POST':
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        from app01 import models
        """ 创建"""
        # models.User.objects.create(name=name,age=pwd)
        """ 查询"""
        # res=models.User.objects.filter(name=name)
        # print(res)  # <QuerySet [<User: User object (1)>]>
        # print(res[0].name)  # kimi
        # print(res[0].id)  # 1
        # print(res[0].age)  # 123
        """ 更新"""
        # models.User.objects.create(name=name, age=pwd)
        # models.User.objects.filter(id=2).update(name=name,age=pwd)
        #现阶段:后端获取到的前端数据,一般都是字符串
        """ 删除"""
        models.User.objects.filter(id=2).delete()

问题总结

注意:

1.当命令窗口也启动django,pycharm也启动django时要注意端口,当端口被别的项目占用了,我们输入命令就会一直等着端口的释放。

2.下面显示你输入的网址在后端没有找到,要按照下面格式输入

image

3.如果在做页面设置,代码改了,也重启了,但是浏览器页面没有反应,那有可能是浏览器直接用了缓存内容,没有去请求服务端。如何解决?

​ 我们可以在浏览器设置那里勾选Disable cache,即开发者工具(右键检查)被打开的时候,禁用缓存内容

image

posted @ 2022-12-09 21:57  魔女宅急便  阅读(202)  评论(0编辑  收藏  举报
Title