首页 > 其他分享 >django02

django02

时间:2022-12-11 01:44:45浏览次数:45  
标签:name get models request POST django02 数据

.静态文件配置

  • 不经常变化的文件,主要针对html文件所使用到的各种资源就是静态文件
    (css文件、js文件、img文件、第三方框架文件)
  • 针对静态文件资源需创建一个static目录统一存放各种静态文件
'以下均为手动创建:'

-static目录
       css目录       # 所有的css文件
       js目录         # 所有的js文件
       img目录        # 所有的img文件
    
      # 第三方框架目录(可不创因为本身就是目录)
       utils/plugins/libs/others目录  
  • 没提前开设静态文件资源访问接口就无法在地址栏访问路由获取对应资源
# 接口可以理解为网址,当给该网址(接口)发送请求时会返回对应的数据

'''
以上简单理解就是如果你用的本地css、js样式(不是联网cdn),如果没做静态资源配置会没有对应样式的!!!! 应该把他当作路由一样需要做相应的关系才可以
'''

静态文件资源配置

也就是当浏览器地址输入对应路由后,让后端的静态文件资源里的css、js等加载出来样式

①settings.py中配置

在配置文件最下方STATIC_URL='/static/'下加一段把static路径添加环境变量中

# static是访问静态文件资源的接口前缀(通行证)
STATIC_URL = '/static/'
# static是存储静态文件资源的目录名称
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
'支持写入多个静态文件资源目录路径(当后期内容多的时候)'

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

——————————————————————————————————————————————————————————————

"""
第一个static是导入本地样式地址的前缀:
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.css">
<script src="/static/bootstrap-3.4.1-dist/js/bootstrap.js"></script>
"""

image

②html中的操作
应该让接口前缀动态匹配

用django模板语法包起来好让接口前缀可以动态获取,当配置文件里的STATIC_URL = '/static/'前缀被要求改名字时可以不用改我的各个html页面,直接动态获取就好

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

image

这是前后端一起写的时候最优解,如果是前后端分离那就不用考虑这个

5.form表单中的网络请求方式

1)form表单中两个属性含义

URL:统一资源定位符(简称网址)
<form action="" method=""></form>
——————————————————————————————————————

action   /*数据提交地址*/
方式一:action=""                      '朝当前页面所在的地址提交'
方式二:action="/index/"               '朝当前服务端的index地址提交'※
方式三:action="https//www.baidu.com/" '完整地址'
———————————————————————————————————————
method   /*数据提交方式*/
'默认不写是get   可手动改为post'

2)form表单中的两种请求方式

①get请求 (默认不写就是get请求)
朝服务端索要数据,可以携带额外数据
携带额外数据的方式:URL?aaa=bbb&ccc=ddd
不能是敏感数据(密码),且问号后面携带的数据大小限制在2KB~4KB左右

②post请求
朝服务端提交数据,可以携带额外数据
携带额外数据的方式:请求体中
请求体中携带的数据安全性高,且数据大小没有限制

3)提交post请求需修改配置

前期提交post请求需在配置文件中注释一行代码:csrf什么的

csrf:跨站请求伪造 目前还无法理解在后面会写

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',
]

6.request对象方法

views.py视图函数中根据以上form表单中的get/post请求应该有不同的处理结果:
如果是get请求:就返回一个html页面
如果是post请求:就获取发送过来的数据

此时应该考虑使用下述代码来操作:

def login_func(request):
    if request.method == 'POST':
		return HttpResponse('数据相关操作')
	return HttpResponse(request,'login.htme')

1)request对象常用方法

后端获取到前端输入的数据 一般都是字符串格式

需注意get()获取的是列表中最后一个数据值!

html有三个标签需要输入不同名字时,会放在一个列表中
如果就一个标签需要输入一个名字时,用get()反而方便

request.method           # 获取纯大写的【请求方式】字符串(GET/POST)

request.POST             # 获取post请求发送来的普通数据(不包含文件)
request.POST.get()       # 获取列表中最后一个数据值
request.POST.getlist()   # 获取整个列表数据(可通过索引获取需要的数据)

request.GET              # 获取网址问号后携带的数据
request.GET.get()        # 获取列表中最后一个数据值
request.GET.getlist()    # 获取整个列表数据(可通过索引获取需要的数据)

2)POST举例1:(GET同理)

def login_func(request):
    if request.method == 'POST':
        print(request.POST)
        # <QueryDict: {'name':['jason','torry','jack'],'pwd':['123']}>
        
        print(request.POST.get('name'))
        # jack
        
        print(request.POST.getlist('name'))
        # ['jason', 'torry', 'jack']
        
        print(request.POST.getlist('name')[0])
        # jason
        return HttpResponse("数据相关操作")
    return render(request, 'login.html')

3)根据以上做简易登录校验

以下仅是简易版,还需连接数据库去做校验,可当作推导流程去了解

image

【html页面】:(注意静态文件资源配置)

<body>
    <div class="container">
        <div class="row">
            <h1 class="text-center">登录页面</h1>
            <div class="col-md-6 col-md-offset-3">
                <form action="/login/" method="post">
                    <p>username:
                        <input type="text" class="form-control" name="name">
                    </p>
                    <p>password:
                        <input type="password" class="form-control" name="pwd">
                    </p>
                    <input type="submit" class="btn btn-danger btn-block" value="用户登录">
                </form>
            </div>
        </div>
    </div>
</body>

【views.py】:

def login_func(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'jason' and pwd == '123':
            return HttpResponse("登陆成功")
        return HttpResponse("用户名或密码错误")
    return render(request, 'login.html')

【urls.py】:

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login_func),
]

6.连接MySQL

1)pycharm连接MySQL

# 1.点击pycharm提供的Database按钮
    在左下角或右侧边栏>>Data Source>>MySQL
  '如果没有则去Settings>>Plugins>>Installed下载Database tools and SQL插件或卸载pycharm重装即可'
# 2.首次连接数据库需在下方找到警示标下载一下对应的驱动
# 3.填好需要输入的数据后需检查一下是否成功,不成功就更换驱动
   '更换驱动:Driver>>MySQL不行就换MySQL fro 5.1'

image

2)django连接MySQL

django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少,实际项目中都会替换掉它

1.settings.py配置文件中修改配置 把原本的DATABASE里的sqlite3改为以下mysql
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 指定数据库软件名称
        'NAME': 'db1',  # 指定库名
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8' 
    }
}

2.第一次使用需准备指定连接MySQL的mysqlclient模块
    django1.X 版本需要在项目或者应用目录下随便一个__init__.py中写一行代码
        import pymysql
        pymysql.install_as_MySQLdb()
  	django2.X 以上版本需要下载mysqlclient模块
        pip3.8 install mysqlclient
     ps:该模块windows下载问题不大 主要是mac电脑可能有问题

image

针对mac电脑下载mysqlclient模块报错只需要点最下面进入源码改成encode即可

image

image

7.ORM操作

1)ORM简介

ORM:关系映射表
作用:用ORM去数据库中查数据时会把表变成对象,可以用点的方式操作
如果想创建一张表,则自己在代码中写一个类,ORM就可以把类转换成表

#ORM把操作类映射成操作表:
类            映射成      表
对象          映射成      一条条数据记录
对象点名字    映射成      字段对应的值

#ORM由于高度封装了数据库,导致有时效率不高,所以还是需要自己写SQL语句

2)ORM基本操作

举例:

1.在django中创建一个表

#应用目录下的【models.py】中编写模型类(创建表)

class Student(models.Model):
    '字段名 = 字段类型 + 约束条件'
    # 类似于SQL里的自增主键
    id = models.AutoField(primary_key=True)
    # 类似于SQL里的创建varchar(32)
    name = models.CharField(max_length=32)
    # 类似于SQL里的创建int型
    age = models.IntegerField()

2.创建完后必须执行数据库迁移、同步命令

python38 manage.py makemigrations  #将操作记录到migrations目录中
python38 manage.py migrate         #将操作同步到数据库上※

image

当执行完右侧会创建出多个表,只用研究app01_student表。(app01仅仅为了区分不同app)

image

注意:只要在models.py中修改了与数据库相关的代码,都必须再次执行数据库迁移、同步命令!!!

3)ORM基本语句

#filter就是筛选过滤

1.增
models.类名.objects.create()
2.查
models.类名.objects.filter()   # 数据对象列表   [数据对象,]
models.类名.objects.filter().first()  # 数据对象
3.改
models.类名.objects.update()
4.删
models.类名.objects.delete()
【增】:

def login_func(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
   
        models.Student.objects.create(name=name,pwd=pwd)
        return HttpResponse('新增数据成功')
    
    return render(request, 'login.html')
【查】:

def login_func(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')

        # user_obj=models.Student.objects.filter(name=name,pwd=pwd)
        # print(user_obj)  # [数据对象,]
        # print(user_obj[0])  # 数据对象
        # print(user_obj[0].name)  # 数据对象.name
        user_obj = models.Student.objects.filter(name=name, pwd=pwd).first()
        
        if user_obj:
            return HttpResponse(f'{user_obj.name}登录成功')
        return HttpResponse('用户名或密码错误')
    return render(request, 'login.html')
【改】:

models.Student.objects.filter(id=1).update(name='上海第一帅')
return HttpResponse('数据修改成功')
【删】:

models.Student.objects.filter(id=1).delete()
return HttpResponse('数据删除成功')

标签:name,get,models,request,POST,django02,数据
From: https://www.cnblogs.com/lvqingmei/p/16972743.html

相关文章