状态码如200 OK,以3位数字和原因 成。数字中的 一位指定了响应 别,后两位无分 。响应 别有以下5种。
重定向:
客户端像服务器端发送请求,服务器告诉客户端你去重定向(状态码302,响应头location=客户端绝路路径),客户端继续像服务器发送请求(请求地址已经成重定向的地址),服务器端给客户端响应
转发
客户端像服务器端发送请求,服务器将请求转发到服务器内部,在响应给客户端
重定向
response.setStatus(302) response.setHeader("location","/项目名称/资源"); 或者简写成 response.sendRedirect("/项目名称/资源")
转发
getRequestDispatcher(“/资源”) .forward(request.response)
区别:
什么时候使用重定向,什么时候使用转发
- 转发地址栏不变(一次请求),重定向地址栏变化(两次)
- 转发不用写项目名称,重定向需要编写项目名称
- 转发可以使用request对象传递值,重定向不可以使用request对象传递值
- 转发只能在服务器的内部进行操作,重定向可以定向到任何的资源
配置静态文件夹2步
1、在项目文件夹下建'static‘文件夹
2、在setiings文件下添加别名路径
STATICFILES_DIRS=[
- os.path.join(BASE_DIR,"STATICS')
- ]
- //添加静态文件夹
STATIC_URL = 'static' //别名
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,"templates"),], # 添加模板路径 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates"),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
django解释器配置(用于打开下载的项目,或打开以前做的项目 ,不配置会报错。)
1、配置项目解释器
file--settings--project Interpreter
project Interpreter: (此处选择安装python的路径)
2、到pycharm 右上角选择项目 edit configuration 选中 run browser
<p>{{ text|truncatechars:9 }}</p> #截取9个字符
<p>{{ text|truncatewords:3 }}</p> #截取3个单词
{{forloop.counter}} 从1 开始计数,写在for 循环里才有用
{{forloop.counter0}} 从0 开始计数,写在for 循环里才有用
{% for person in person_list %} <p>{{ forloop.counter0 }} {{ person.name }} {{ person.age }}</p> {% empty %} ##嵌套在for 循环里,相当于python 里的else作用 <p>列表为空</p> {% endfor %}
django将模型转为mysql数据库中的表
在book下的models.py中创建模型: from django.db import models # Create your models here. class Book(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) state=models.BooleanField() pub_date=models.DateField() price=models.DecimalField(max_digits=8,decimal_places=2) publish=models.CharField(max_length=32) settings配置 若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要连接的数据库,连接前需要创建好 'USER':'root', # 连接数据库的用户名 'PASSWORD':'', # 连接数据库的密码 'HOST':'127.0.0.1', # 连接主机,默认本级 'PORT':3306 # 端口 默认3306 } }
#迁移之前必须先手动创建好'bms'库 ##在settings.py 中 检查INSTALLED_APPS中查找INSTALLED_APS中 “app01”(应用文件夹名,没有就添加,否则会报错)
注意1:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动
创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb
对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的init,在里面写入:
import pymysql
pymysql.install_as_MySQLdb()
最后通过两条数据库迁移命令即可在指定的数据库中创建表terminal中输入:
python manage.py makemigrations
python manage.py migrate
Django设置调试models输出的SQL语句
django1.3在shell下,调试models变得更为简单了,不用像之前的版本,手工去调用django query,才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings.py里,配置如下logging即可: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
Django的API操作mysql中常用的语句
【背景】
增/删/改/查 如何操作数据库
导入数据库的模型
【增加记录】--三种方法
方法一: 直接使用数据模对象的create函数
In [24]: People.objects.create(name='shuaige')
Out[24]: <People: People object>
注意:创建成功返回对象地址
方法二:
方法三:
【删除记录】--找对对象,使用delete() 进行删除
第一找出你要删除的对象集合(id大于2的)
使用delete对象将其删除
将返回珊瑚的条目数
【改记录】-先找出来,在将对象属性重新赋值
(将id=1的名字改成andyliu)
【查】 这就相当于mysql中sql语句中的select语句,其中有很多字语句进行限制查询
1 获取所有记录对象
all_record = People.objects.all()
如果要获取对象值,需要先取出某一个对象,然后取出对象中的属性
2 获取某个域为指定值的对象
注意: 这个用法不常用,如果要用,你一定要保证,你查找的一定存在这样的一个记录,且必须是唯一,不然会报错哦
3 类似mysql中where进行的条件查询使用filter函数
第一: 整数的范围比较查询()
将id大于1的对象找出来,并以值列表的形式进行返回
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
ne | 不等于 |
in(也可以是其他数据类型) | 位于给定列表中: People.objects.filter(id__in=[1, 3, 4]) 返回一个 polls 列表(ID 值分别是 1或3或4). |
4 多过滤条件查询,有一种方法是,多次使用filter函数即可
5 查找到的对象数据(即符合条件的记录的数目)
In [25]: People.objects.count()
Out[25]: 3
等于:
In [26]: People.objects.all().count()
Out[26]: 3
符合条件的长度
6 order_by()函数,进行升序/降序
-负数表示要进行降序排序
7 in list
8 not in list(这里没有直接的not in list) 但是可以使用exclude,除外来等价
9. 包含关键字的(集合链式查询)
表中的所有数据:
name这个field包含name的关键字的record记录
name这个field包含name的关键字的record记录并且年龄age字段不能等于23的! 使用链式查询
以上需求用filter进行等价操作,取出22岁的
10 对象索引,类似python 列表中的切片
In [29]: Person.objects.all()[1:3]
Out[29]: [<Person: Person object>, <Person: Person object>]
In [30]: Person.objects.all()[1:3].values_list()
Out[30]: [(2, 'name2', 22), (3, 'name3', 22)]
但是不知持负索引(会报错),如
Person.objects.all()[-1]
取代的方法:使用reverse方法来解决