Django框架(二)
静态文件及相关配置
1.静态文件
html页面上使用的不经常改变的资源
1.第三方框架文件,如Bootstrap框架
2.css样式文件
3.网站js文件
4.image图片文件
针对静态文件资源一般都会放在static文件夹内
当static目录下出现了很多不同类型的静态文件资源 那么还可以分类管理
others文件夹
第三方框架文件
css文件夹
所有的css文件
js文件夹
所有的js文件
img文件夹
所有的img文件
2.针对静态文件资源的访问也需要提前开设相应的接口
STATIC_URL = '/static/'
# 静态文件资源配置,可以定义多个静态文件,且路径查找顺序是从上而下的
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
3.接口前缀
STATIC_URL = '/static/' # 接口前缀可以更改,但更改后原有的前缀就会失效,需要指定为更改后的前缀
4.动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
静态文件配置实例
views.py
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
# 1.给前端返回一个登录页面
return render(request, 'login.html')
urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
]
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
{# <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>#}
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">用户登录</h1>
<div class="col-md-8 col-md-offset-2">
<form action="">
<p>username:<input type="text" name="username" class="form-control"></p>
<p>password:<input type="text" name="password" class="form-control"></p>
<input type="submit" value="登录" class="btn btn-block btn-danger">
</form>
</div>
</div>
</div>
</body>
</html>
实例验证
http请求方法
"""
URL:统一资源定位符(网址)
"""
1.GET请求
朝别人索要数据
也可以携带额外的数据
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请求前期需要去settings配置文件中注释一行代码
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
request对象方法
request.method 获取请求方式 结果是纯大写的字符串
request.POST 获取请求体发送来的普通数据(不包含文件)
request.POST.get() 默认只获取列表中最后一个数据值
request.POST.getlist() 获取键对应的整个列表,无论有几个数据值
request.GET 获取url后面携带的非敏感数据
request.GET.get() 默认只获取列表中最后一个数据值
request.GET.getlist() 获取键对应的整个列表,无论有几个数据值
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
"""该函数会通过不同的请求方式触发,并且需要执行不同的业务逻辑代码"""
# print(request.method)
# if request.method == 'GET':
# # 1.给前端返回一个登录页面
# return render(request, 'login.html')
# elif request.method == 'POST':
# # 2.获取用户数据
# # print(request.POST) # <QueryDict: {'username': [''], 'password': ['']}>
# res = request.POST.get('username')
# print(request.GET)
# return HttpResponse('登录成功')
if request.method == 'POST':
print(request.POST)
return HttpResponse('登录成功')
return render(request, 'login.html')
pycharm连接mysql数据库
查找pycharm提供的database按钮,如下图:
首次链接数据库需要下载对应的驱动,如下图:
实现简单的增删改查,如下图:
Django连接mysql数据库
django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少
settings配置文件中,数据库默认配置为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
1.settings配置文件中修改配置即可
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称
'NAME': 'day55', # 指定库名
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
2.指定链接MySQL的模块
django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块
pip install mysqlclient
Django orm简介
ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。
Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如 PostgreSQL、MySQL、Oracle、Sqlite3 等。
from django.db import models
# Create your models here.
# 1.定义一个模型类
class User(models.Model): # 类似于定义了表名
id = models.AutoField(primary_key=True) # 类似于定义了主键
# 对应的sql语句 id int primary key auto_increment
name = models.CharField(max_length=32) # 类似于定义了字段
# 对应的sql语句 name varchar(32)
pwd = models.IntegerField() # 类似于定义了字段
# 对应的sql语句 pwd int
1.数据库迁移/同步命令
1.将models中有关数据库的操作记录下来(migrations文件夹)
python3 manage.py makemigrations
2.将操作真正影响到数据库中
python3 manage.py migrate
'''当修改了models中与数据库相关的代码 都必须执行上述的命令,先执行makemigration,后执行migrate'''
2.表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键
如果你需要主键的名称不叫id 只能自己创建
数据库迁移/同步命令可以简写,也可以指定应用单独迁移/同步,在pycharm中,点击上方Tools,选择Run manage.py Task即可弹出,如下图所示:
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()
if request.method == 'POST':
# print(request.POST)
username = request.POST.get('username')
password = request.POST.get('password')
# 查询表数据
# res = models.User.objects.filter(name=username, pwd=password).first()
# print(res) # <QuerySet [<User: User object (1)>]> 列表套对象
# 新增表数据
# models.User.objects.create(name=username, pwd=password)
# 修改表数据
# models.User.objects.filter(id=4).update(name='lisa')
# 删除表数据
models.User.objects.filter(id=4).delete()
# user_obj = res[0]
# if user_obj:
# print(user_obj.id) # 1
# print(user_obj.name) # tony
# print(user_obj.pwd) # 666
# return HttpResponse('登录成功')
# return HttpResponse('用户名或密码错误')
return render(request, 'login.html')
ORM外键关联
MySQL
一对多
外键字段建在多的一方
多对多
外键字段建在第三张关系表
一对一
外键字段建在查询频率较高的表中
ORM
一对多
外键字段建在多的一方
class Book(models.Model):
title = models.CharField(max_length=32)
# 书与出版社是一对多 书是多
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
多对多
外键字段可以直接写在某张表中 orm会自动帮你创建第三张表
class Publish(models.Model):
pub_name = models.CharField(max_length=32)
# 书与作者是多对多 在mysql中多对多需要额外自己创建一张表)
author = models.ManyToManyField(to='Author')
一对一
外键字段建在查询频率较高的表中
class Author(models.Model):
name = models.CharField(max_length=32)
# 作者与作者详情是一对一 外键建立在查询频率较高的表中
detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
标签:name,models,08,request,数据库,2022,POST,django,31
From: https://www.cnblogs.com/dy12138/p/16644592.html