# 启动django项目之后 如何添加更多的功能 回想自己编写的web框架 如果要添加功能 就去urls.py和views.py # django自带重启功能 当识别到项目中代码有变化之后 隔段时间会自动重启 但是有时候较慢 # 与浏览器打交道的视图函数都应该有返回值 常见的就是下列三个 HttpResponse 主要用于返回字符串类型的数据 render 主要用于返回html文件 并且支持模板语法(django自己写的) redirect 主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
主要用于返回字符串类型的数据 def index(request): return HttpResponse('index页面') 在页面中就会显示 index页面
主要用于返回html文件 并且支持模板语法(django自己写的) 在浏览器中输入http://127.0.0.1:8000/index/后,会返回index.html页面。 def index(request): return render(request,'index.html') 使用render给前端传值 def index(request): return render(request,'index.html',{'name':'春游去动物园'}) 传过去是什么数据类型,在前端使用时还是什么数据类型。 <h1>index页面</h1> <span>{{ name }}</span> #此时name的值为春游去动物园
主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀 在浏览器中输入http://127.0.0.1:8000/index/时 重定向到一个完整的网址 def index(request): return redirect('http://www.baidu.com') 重定向到自己网站 def login(request): return render(request,'login.html') def index(request): return redirect('/login/')
""" 我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源 是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问 言外之意就是我们没有开设接口 那么肯定访问不到 """ # 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文件夹
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") ] '''
{#导入静态文件#} {% load static %} {#加载应用home下static指定静态文件--图片#} <img src={% static 'images/img001.jpg' %}> {#加载静态文件下的CSS文件夹或指定css文件#} <link rel="stylesheet" href="{% static 'css/as.css' %}">
# 获取当前请求方式 request.method 返回的是纯大写的请求方法字符串'POST' 'GET' # 获取post请求提交的普通数据 request.POST 结果是一个QueryDict 可以看成字典处理 {'username':['春游去动物园'],'hobby':['篮球','羽毛球']} request.POST.get('username') # 春游去动物园 request.POST.get('hobby') # 羽毛球 request.POST.getlist('hobby') # ['篮球','羽毛球'] """ get方法会拿到值列表中最后一个元素 而不是整个列表 getlist方法会直接拿到整个值列表 """ # 获取get请求提交的普通数据 request.GET 结果是一个QueryDict 可以看成字典处理{'username':['春游去动物园'],'hobby':['篮球','羽毛球']} request.GET.get('username') request.GET.getlist('hobby') # ['篮球','羽毛球']
# 如果是POST请求的话,django会报错。 出现这个错误的原因主要是,跨站请求伪造。 简单来说就是,django框架为我们提供了一个中间件,用于处理跨站请求伪造的,假如某个用户从来没有登录过我们的网站就给我们网站post数据,这样是会被django这个中间件给阻挡,禁止请求。然后我们在开发web的时候可以给每一个登录的用户分配一个token。这个token会被写入到用户的cookie文件里面。然后下次用户post数据的时候,就会带上这个token。 因此如果没有token的用户就会被禁止post数据。 # 方法一: 在settings.py里面注释掉 'django.middleware.csrf.CsrfViewMiddleware'这一行 # 方法二: 在视图文件views.py里面使用@csrf_exempt views.py 中导入模块 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def login(request): if request.method == 'POST': print(request.POST) print(request.POST.get('username')) print(request.GET) print(request.GET.get('info')) return render(request,'login.html') 加上那一句@csrf_exempt之后 ,就表示,当前的函数不受django跨站请求伪造的中间件的限制。
"""其实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默认自带一个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()
ORM:对象关系映射
# 特点 能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL 好处:提升了开发效率... 坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优 # 概念 表 类 一行行数据 类产生的一个个对象 数据字段 对象的一个个属性
python3 manage.py makemigrations # 记录操作 python3 manage.py migrate # 将操作迁移到数据库 """ 首次执行迁移命令 django还会自动创建一些默认需要使用到的表 """
'属性名 = models.字段类型,定义属性时需要指定字段类型, 通过字段类型的参数指定选项' 属性名: 不允许使用python的保留关键字 不允许使用mysql的保留关键字 不允许使用连续的下划线,因为Django的查询语法就是连续的下划线 'AutoField':自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性 'BooleanField':布尔字段,值为True或False 'NullBooleanField':支持Null、True、False三种值 'CharField(max_length=20)':字符串 参数max_length表示最大字符个数 'TextFiled':大文本字段,一般超过4000个字符时使用 'IntegerField':整数 'DecimalField(max_digits=None, decimal_places=None)':可以指定精度的十进制浮点数 参数max_digits表示总位数 参数decimal_places表示小数位数 'FloatField()':浮点数 'DateField([auto_now=False, auto_now_add=False])':日期 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它 总是使用当前日期,默认为false 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当 前日期,默认为false 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 'TimeField':参数和DateField一样 'DateTimeField':日期时间,参数同DateField 'FileField':上传文件字段,以二进制的形式 'ImageField':继承于FileField,对上传的内容进行校验,确保是有效的图片
# 如果需要使用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
# 1.增 models.表名.objects.create(field1='XXX', field2='XXX', ...) 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.查 models.表名.objects.filter(筛选条件) res = models.Users.objects.filter(name='jojo') print(res) # <QuerySet [<Users: Users object>]> print(res[0]) # Users object print(res[0].uid) # 1 print(res[0].name) # jojo print(res[0].pwd) # 123 # 3.改 models.表名.objects.filter(筛选条件).update(修改内容) models.Users.objects.filter(uid=1).update(name='jasonNB') # 4.删 models.表名.objects.filter(筛选条件).delete() models.Users.objects.filter(uid=3).delete()