day51(django小白必会三板斧 orm MSQL)

今日内容详细

django小白必会三板斧

这个三板斧可不是程咬金三板斧科比程咬金的复杂多了

img

#首先思考启动项目之后 如何添加更多的功能
  回想我们昨天纯手写的web框架 如果  要添加新的功能 urls.py和views.py  
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
我们进行已知推未知,可以知道这里的路由和视图函数是对应关系都是django内部帮我们写好的属于他自己自带的一个
(http://127.0.0.1:8000/admin/login/?next=/admin/)
由上述可知他自己可以写我们也可以想办法写个功能所以咱直接模仿他这个
因为他这个urls.py做对应关系的所以我们秉持着软件开发目录架构的规范所以我们要拆分然后去别的vies下面写视图功能
#视图函数:用于跟浏览器交互的视图函数是必须要有一个返回值 return返回值  这个返回值要遵循别人给你封装好的
#HttpResponse
首先我们看这个这个他是主要用于返回字符串类型的数据,我们只需关注自己的核心业务其他一概不用管他会帮我们封装好
 #render
 #   首先我们来想web框架可以结合前后端所以我们返回到前端的肯定不能是一些文字所以我们就用到了这个模块,render 主要用于返回html页面专用 并且支持django自己写的模板语法怎么说他就是可以给这个html页面传值
# redirect
  	主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
 代码:
    def index(request):
    return HttpResponse('重现python荣光,我被义不容辞')
    return render(request,'index.html',{'name':'牛马吕辰熙'})
    return redirect('https://www.43ckck.com') (友情提示建议使用正经网站当然这个网站也是正经网站)
	return redirect('/home/')
看到这里我们可以感觉到为什么这是三板斧,我们平时所访问的浏览器是终究逃不过这三种情况

img

登录功能

"""
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到
"""
# 1.开设接口返回登录界面
# 2.登录界面需要使用bootstrap并且还需要自己编写css和js
	静态文件
# 3.页面需要获取前端用户数据并且传递给后端
	form表单
  	action参数:控制数据的提交地址
    method参数:控制请求的提交方式
# 4.访问登录页面
	静态文件全部显示资源不存在
  	http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
  因为我们并没有开设静态资源访问的接口 
# 5.开设静态资源的访问接口
	理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
  只要是一个web项目都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件 只需要填写固定的配置即可开设资源接口
  settings.py
  	# 静态文件资源访问接口固定配置
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    # html页面路径
    	/static/mycss.css
# 6.配置文件中的两点疑惑
	STATIC_URL = '/static/'  # 作用是什么
  STATICFILES_DIRS = []  # 为什么是列表(用来存储多个元素的)
  """
以该地址为例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
    /static/是接口前缀 表示具备访问静态文件资源的权限
    具备了权限之后会拿着接口前缀后面的文件路径去列表中每个文件夹中查找
        bootstrap-3.3.7-dist/css/bootstrap.min.css
    找到一个就结束
        比如 static和static1里面都有a.txt 那么只会拿到static中的
	"""
# 7.接口前缀动态绑定
	如果templates中有很多html文件并且都需要引入静态资源
  现在把接口前缀修改了 那么会造成什么结果???>>>:页面无法加载资源
  {% load static %}
  <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">

静态文件

# 编写完成后不会经常被修改的与html页面相关的文件 
	css文件、js文件、图片文件、第三方框架文件(bootstrap)
 	上述文件都可以称之为是'静态文件' 
  	在django中静态文件单独开设一个文件夹存储  默认叫static文件夹
  在该文件夹内还可以根据功能的不同继续划分不同的文件
  	css文件夹 js文件 img文件夹 others文件夹

img

request对象方法

"""
提交post请求 默认会报403
	前期不需要过多考虑 直接去配置文件中注释一行即可
		MIDDLEWARE = [
    	# 'django.middleware.csrf.CsrfViewMiddleware',
		]
"""
1.get请求和post请求都会触发同一个视图函数login的运行
	如何针对不同的请求执行不同的代码
  	get请求返回一个登录页面
    post请求获取用户数据并校验
2.获取当前请求方式
	request.method  	返回的是纯大写的请求方法字符串
  	"""由于get请求更加常见 post请求次之 所以还可以按照下列方式简写"""
    if request.method == 'POST':
        return HttpResponse('行文至此落笔为终')
    """默认让视图函数处理get请求"""
    return render(request, 'login.html')
3.获取post请求提交的普通数据
	request.POST      结果是一个QueryDict 可以看成字典处理
  request.POST.get('username')
  request.POST.getlist('hobby')
  """
      get方法会拿到值列表中最后一个元素  而不是整个列表
      getlist方法会直接拿到整个值列表  
  """
4.如何获取url后面携带的数据
	request.GET      结果是一个QueryDict 可以看成字典处理
  request.GET.get('info')
  request.GET.getlist('cityList')
  """
  特征与上述request.POST一致 使用场景也很多
  	https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1
  """

pycharm链接MySQL

img

"""其实pycharm也可以充当很多数据库软件的客户端"""
1.pycharm右上方侧边 database
2.pycharm左下方边角 database
3.上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm
	settings
  	plugins
    	搜索database下载apple即可
   
# 链接数据库
	1.选择数据库 
  2.首次链接需要下载驱动
  	download driver...
  3.测试链接如果不通过 则需要换驱动重新下载使用
  	Driver:MySQL MySQL for 5.1
 	'''不再过多讲解 课下可自行研究'''
pycharm也提供了很多链接不同数据库的接口     但是操作界面没有专门的数据库链接软件方便# 链接出问题的原因大部分是因为驱动选择和下载问题

img

django链接MySQL

"""
django默认自带一个sqlite3数据库 但是功能很少 仅用于本地测试
"""
1.默认配置
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
2.修改配置
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jp_05',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'jason123',
    }
}
3.指定模块
	在项目同名的文件夹内的__init__.py
  或者应用名的文件夹内的__init__.py
  添加一行固定的代码
  	import pymysql
		pymysql.install_as_MySQLdb()

img

django orm简介

ORM:对象关系映射
# 特点
	能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
  	好处:提升了开发效率...
    坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
# 概念
	表												类 
  一行行数据					 			 类产生的一个个对象
  数据字段					  			对象的一个个属性
ORM概念
什么是“持久化”
即把数据(如内存中的对象)保存的磁盘的某一文件中。

什么是持久层
持久层(Persistence Layer),即实现数据持久化应用领域的一个逻辑层面,将数据使用者和数据实体相关联。

什么是ORM
ORM:对象关系映射
# 特点
	能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
  	好处:提升了开发效率...
    坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
# 概念
	表												类 
  一行行数据					 			 类产生的一个个对象
  数据字段					  			对象的一个个属性ORM,即Object Relational Map
ping,它是对象关系模型的简称。它的作用是在关系型数据库和对象之间作一个映射。使程序能够通过操纵描述对象方式来操纵数据库。

ORM作用
ORM解决的主要问题是对象关系的映射,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。 ## ORM技术特点:
1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

orm的基本使用

# 如果需要使用ORM 需要去应用下的models.py中编写代码
1.编写类代码
	class Users(models.Model):
    uid = models.AutoField(primary_key=True)  # 等价于uid int primary key auto_increment
    name = models.CharField(max_length=32)  # 等价于name varchar(32)
    pwd = models.IntegerField()  # 等价于pwd int
2.执行数据库迁移命令
	python3 manage.py makemigrations  # 记录操作
  python3 manage.py migrate  # 将操作迁移到数据库
  """
	首次执行迁移命令 django还会自动创建一些默认需要使用到的表
  """
3.表名的特征
	Users								app01_users
  由于django支持多个应用  为了区分不同应用下可能会出现相同的表名
  所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要你是个正常的程序员都不会犯这样的错误)
4.扩展
	1.表的主键可以不写 orm会自动帮你写一个名为id的主键
  2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
  	针对两个迁移命令 可以采用pycharm提示功能编写
    	tools 
      	run manage.py task

数据操作

img

# 1.增
	user_obj = models.Users.objects.create(name='jack', pwd='333')
  print(user_obj)
  print(user_obj.uid)
  print(user_obj.name)
  print(user_obj.pwd)
# 2.查
	res = models.Users.objects.filter(name='jason')
  print(res)  # <QuerySet [<Users: Users object>]>
  print(res[0])  # Users object
  print(res[0].uid)  # 1
  print(res[0].name)  # jason
  print(res[0].pwd)  # 123
# 3.改
	models.Users.objects.filter(uid=1).update(name='jasonNB')
# 4.删
	models.Users.objects.filter(uid=3).delete()
1.使用自带的sqlite3数据库
	第一次使用pycharm链接sqlite3也需要先下载驱动
2.编写注册、登录功能
	'''静态文件无法拖拽到pycharm文件栏:C盘不支持 采用cv操作'''
  前期提交post请求初选403 需要配置文件注释一行

def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        confirm_pwd = request.POST.get('confirm_password')
        # 1.先判断两次密码是否一致
        if not password == confirm_pwd:
            return HttpResponse('两次密码不一致')
        # 2.判断用户名是否已存在
        is_user = models.UserInfo.objects.filter(name=username)
        if is_user:
            return HttpResponse('当前用户已存在')
        # 3.写入数据库
        models.UserInfo.objects.create(name=username, pwd=password)
        # return HttpResponse(f'{username}注册成功')
        # 4.直接跳转到登录页面:后面还可以实现 注册之后自动登录
        return redirect('/login/')
    return render(request, 'reg.html')


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        is_user = models.UserInfo.objects.filter(name=username).first()
        # filter结果是列表套对象
        if not is_user:
            return HttpResponse('用户名不存在')
        if str(is_user.pwd) == password:  # 获取到的用户输入是字符串 数据库字段是整型
            return HttpResponse("登录成功")
        return HttpResponse('密码错误')
    return render(request, 'login.html')

回顾以前知识

span 是一个文字标签等于小括号
span的添加,不会对文字造成任何的变化,目的作用在于,将一段文字中的某一个或者几个文字进行样式的更改,可以用span尽心包裹,然后设置span格式
⭐action:世超当前所在的页面提供数据
⭐ method参数:控制请求的提交方式

今日单词仅供参考

img

注:并不代表代码里也是这个意思

http:协议网址 超文本传送协议 服务端口
views:视图
urls:网址
templates:模板
tornado:龙卷风
install:安装
start:开始 开端
project:项目
manage:管理 
port:端口
runserver:运行服务器
migrations 迁移 ; 移居 ; 迁徙 ; 改变 ; 迁移,转移 ; migratio
settings:设置
models:模型
migrations:
render:提供 ; 使成为 ; 使变得 ; 使处于某状态 ; 给予 ; 回报 
redirect :重新使用 ; 改寄 ; 改变投递方向
method 方法 ; 办法 ; 措施 ; 条理 ; 有条不紊
bootstrap:独自创立
request:要求
Query:查询 询问 疑问
database:数据库
plugins:插件 外挂
Driver:驱动程序 ; 驱动因素
default 违约 ; 默认 ; 预设 ; 不履行义务 ; 预置 ; 系统设定值
field:领域
migrate:迁移
task:任务
object:对象
posted @   文质彬彬赵其辉  阅读(255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示