Django基础篇:响应小白必会三板斧、静态文件、request方法、pycharm链接MySQL、Django链接MySQL、ORM

2022.5.11 django与前端、数据库交互基本操作

  • django小白必会三板斧
  • 静态文件及相关配置
  • request对象方法
  • pycharm链接MySQL
  • django链接MySQL
  • django orm

一、Django小白必会三板斧

HttpResponse、render、redirect

# 启动项目之后,如何添加更多的功能
	urls.py, views.py
# django自带重启功能
	当识别到项目中代码有变化之后,pycharm隔段时间会自动重启,但是有时候比较慢;
# 与浏览器打交道的视图函数都应该有返回值,常见的就是下面三个:
	(1)HttpResponse
    	主要用于返回字符串类型的数据;
        eg:
        return HttpResponse('你好啊 django的学习可容不得半点马虎!!!')
    
    (2)render
    	主要用于返回html文件,并且支持模板语法(django自己写的);
        eg:
        return render(request, 'index.html')
        return render(request, 'index.html',{'name':'jason'})  # index中有使用模板语法,可以使用字典中的数据
    
    (3)redirect
    	主要用于重定向,括号内可以写其他网站的全程,也可以写自己网站的后缀
         eg:
        return redirect('https://www.sogo.com')

二、静态文件及相关配置

1、概念:

一些不会经常被修改的与html页面相关的文件,如css文件、js文件、图片文件、第三方框架文件(bootstrap),都可以称为动态文件。

2、static文件夹:

在django中静态文件单独开设一个文件夹存储,默认叫static文件夹,该文件夹内还可以根据功能的不同继续划分不同的文件,如css文件夹、js文件夹、img文件夹、others文件夹等。

3、登录功能推导出静态文件配置

# 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' %}">

4、相关配置:

# settings.py配置文件
	# /static/是访问静态资源的接口前缀
	STATIC_URL = '/jason/'  
    # 静态文件资源访问接口固定配置
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),  # static是存储静态文件资源的文件夹名称
        os.path.join(BASE_DIR, 'static1'),  # static1是存储静态文件资源的文件夹名称
        os.path.join(BASE_DIR, 'static2'),  # static2是存储静态文件资源的文件夹名称
        ...  # 列表套路径意思是可能会有多个static文件夹
    ]
    
# 接口前缀动态绑定
解决问题:假如接口前缀名更改,html中对应的前缀可能就无法使用;
解决方法:
	# html文件中
	{% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">

三、request对象方法

request对象方法可以帮助我们获取页面向后端传递的请求或者数据,目前主要以get请求和post请求为主。

# 问题1:django框架,在接收页面提交post请求时,默认会报403错误
	解决办法:配置文件中注释一行代码即可
    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',
]
# 问题2:get请求和post请求都会触发同一个视图函数login的运行,如何针对不同的请求执行不同的代码 >>>: get请求返回一个登录页面;post请求获取用户数据并校验;
def login(request):
	if request.method == 'POST':  # 用户提交登录数据后
        return HttpResponse('默默的奋斗才是王道 有了成就才有发言权')
        username = request.POST.get('username')
        password = request.POST.get('password')  # 获取用户输入后可进行数据比对
        # 比对数据...
        return HttpResponse('默默的奋斗才是王道 有了成就才有发言权')
    return render(request, 'login.html')  # 默认处理get请求,用户使用前缀获取登录界面时,返回html登录界面,让用户输入;
    

# request对象方法
    1.获取post用户提交数据后,可以通过代码获取相关内容比对;
    request.POST  # 结果是一个QueryDict,可以看成字典处理;
    request.POST.get('username')  # 获取标签name='username'的用户输入的数据
    request.POST.getlist('hobby')  # 获取标签name='hobby'的用户传入的多个数据
    
    2.获取url后面携带的数据
    request.GET  # 结果是一个QueryDict,可以看成字典处理;
    request.GET.get('info')  # 获取url携带的info='123'数据
    request.GET.getlist('cityList')  # 获取url携带的多个数据
    以下面网址为例(?后面是携带的数据):
    	https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1

四、pycharm链接MySQL

"""其实pycharm也可以充当很多数据库软件的客户端"""
1.pycharm右上方侧边 >>> database
2.pycharm左下方边角 >>> database
3.上述两个地方都没有,需要下载插件,或者直接重装一个正常的pycharm
	settings
  	plugins
    	搜索database下载apple即可
        
# 链接数据库
    1.选择数据库 
    2.首次链接需要下载驱动
    	download driver...
    3.测试链接如果不通过 则需要换驱动重新下载使用
    	Driver:MySQL MySQL for 5.1
        '''不再过多讲解 课下可自行研究'''

OazltA.md.png

如遇到连接超时或者下载不成功,可以点击扳手然后点击右边的加号

,手动添加下载好的合适的jar版本(超时会提醒下载链接复制到谷歌回车即可下载)

五、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()

六、Django orm

1、django orm简介

ORM:对象关系映射
# 特点
	能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL;
  	好处:提升了开发效率...
    坏处:封装了SQL语句,有时候可能效率不高,还需要人为编写SQL调优;
# 概念
    表							类 
    一行行数据					 类产生的一个个对象
    数据字段					  对象的一个个属性

2、orm基本使用

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 >>>

3、数据操作

# 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()
posted @ 2022-05-11 23:08  马氵寿  阅读(145)  评论(0)    收藏  举报