5.11python笔记
django与前端、数据库交互基本操作
HttpResponse、render、redirect
#HttpResponse
主要用于返回字符串类型的数据
def index(request):
return HttpResponse('index页面')
在页面中就会显示 index页面
#render
主要用于返回html文件,并且支持模板语法(django自己写的);
eg:
return render(request, 'index.html')
return render(request, 'index.html',{'name':'jason'}) index中有使用模板语法,可以使用字典中的数据
#redirect
主要用于重定向,括号内可以写其他网站的全程,也可以写自己网站的后缀
eg:
return redirect('https://www.sogo.com')
静态文件及相关配置
一些不会经常被修改的与html页面相关的文件,如css文件、js文件、图片文件、第三方框架文件(bootstrap),都可以称为动态文件。
#static文件夹:
在django中静态文件单独开设一个文件夹存储,默认叫static文件夹,该文件夹内还可以根据功能的不同继续划分不同的文件,如css文件夹、js文件夹、img文件夹、others文件夹等。
1、在项目页面的 settings.py 文件中配置 STATIC_URL 。
STATIC_URL = '/static/'
STATIC_URL的作用是用于拼接静态文件的存储路径。
2、在配置文件中配置STATICFILES_DIRS为静态文件的存储路径。
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
这里的 static是在和项目同级的目录下创建static 文件夹,用来存储静态文件。
在static 文件夹下,可以创建 css、js、fonts、images等文件下来分类存放静态文件。
'''
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
'''
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
'''不再过多讲解 课下可自行研究'''
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
django orm简介:
ORM:对象关系映射
# 特点
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL;
好处:提升了开发效率...
坏处:封装了SQL语句,有时候可能效率不高,还需要人为编写SQL调优;
# 概念
表 类
一行行数据 类产生的一个个对象
数据字段 对象的一个个属性
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 >>>
数据操作
# 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()

浙公网安备 33010602011771号