第6模块 web框架口述题

状态码如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中常用的语句

 

【背景】

增/删/改/查 如何操作数据库

导入数据库的模型

In [23]: from blog.models import People
 

【增加记录】--三种方法

方法一: 直接使用数据模对象的create函数

In [24]: People.objects.create(name='shuaige')    

Out[24]: <People: People object>

 

注意:创建成功返回对象地址

方法二:

In [6]: record = People(name='choubaguai')    
In [7]: record.save()
 

 

方法三:

In [9]: record = People()  
In [10]: record.name ='andy'
In [11]: record.save()
 

 

【删除记录】--找对对象,使用delete() 进行删除

 

第一找出你要删除的对象集合(id大于2的)

In [19]: r_d = People.objects.filter(id__gt =2)
 

使用delete对象将其删除

In [20]: r_d.delete()
Out[20]: (3, {'blog.People': 3})
 

 

将返回珊瑚的条目数

 

 

【改记录】-先找出来,在将对象属性重新赋值

(将id=1的名字改成andyliu)

In [21]: People.objects.values_list()
Out[21]: [(1, 'liudehua'), (2, 'zhangxueyou')]
In [22]: r_m = People.objects.get(id=1)
In [23]: r_m.name = 'andyliu'
In [24]: r_m.save()
In [25]: People.objects.values_list()  
Out[25]: [(1, 'andyliu'), (2, 'zhangxueyou')]
 

 

 

 

 

【查】 这就相当于mysql中sql语句中的select语句,其中有很多字语句进行限制查询

 

1 获取所有记录对象

all_record = People.objects.all()        

如果要获取对象值,需要先取出某一个对象,然后取出对象中的属性

In [32]: for record in all_record:
   ....:     print(record.id)
   ....:     print(record.name)
   ....:     
1
andyliu
2
zhangxueyou
 

 

 

2 获取某个域为指定值的对象

In [11]: r_p = People.objects.get(name='zhangxueyou')       
In [12]: r_p.id
Out[12]: 2
 

 

注意: 这个用法不常用,如果要用,你一定要保证,你查找的一定存在这样的一个记录,且必须是唯一,不然会报错哦

 

 

3 类似mysql中where进行的条件查询使用filter函数

 

第一: 整数的范围比较查询()

将id大于1的对象找出来,并以值列表的形式进行返回

In [15]: People.objects.filter(id__gt=1).values_list()
Out[15]: [(2, 'zhangxueyou'), (6, 'andyliu')]
 

 

 

gt 大于
gte 大于等于
lt 小于
lte 小于等于
ne 不等于
in(也可以是其他数据类型) 位于给定列表中: People.objects.filter(id__in=[1, 3, 4]) 返回一个 polls 列表(ID 值分别是 1或3或4).
In [16]: People.objects.filter(name__in=['andyliu','zhangxueyou']) 
Out[16]: [<People: People object>, <People: People object>, <People: People object>]
 

 

 

4 多过滤条件查询,有一种方法是,多次使用filter函数即可

In [17]: People.objects.filter(id__gt=1).filter(name='andyliu')          
Out[17]: [<People: People object>]
In [18]: People.objects.filter(id__gt=1).filter(name='andyliku')
Out[18]: []
 

 

5 查找到的对象数据(即符合条件的记录的数目)

 

In [25]: People.objects.count()

Out[25]: 3

等于:

In [26]: People.objects.all().count()  

Out[26]: 3

 

符合条件的长度

In [24]: People.objects.filter(name='andyliu').count() 
Out[24]: 2
 

 

6 order_by()函数,进行升序/降序

 

-负数表示要进行降序排序

In [14]: p = People.objects.order_by('-id')
In [15]: for i in p:                       
    print(i.id)
   ....:     
6
2
1
 

 

 

7 in list

In [15]:
Person.objects.filter(id__in = [1,2]).values_list()
Out[15]: [(1,
'name1', 22), (2, 'name2', 22)]
 

 

8 not in list(这里没有直接的not in list) 但是可以使用exclude,除外来等价

In [16]:
Person.objects.exclude(id__in = [1,2]).values_list()
Out[16]: [(3,
'name3', 22), (4, 'name3', 22)]
 

 

9. 包含关键字的(集合链式查询)

表中的所有数据:

In [20]: Person.objects.values_list()
Out[20]: [(1, 'name1', 23), (2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
 

 

name这个field包含name的关键字的record记录

In [21]: Person.objects.filter(name__contains="name").values_list()
Out[21]: [(1, 'name1', 23), (2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
 

 

name这个field包含name的关键字的record记录并且年龄age字段不能等于23的! 使用链式查询

In [23]: Person.objects.filter(name__contains="name").exclude(age=23).values_list()
Out[23]: [(2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
 

 

以上需求用filter进行等价操作,取出22岁的

In [24]: Person.objects.filter(name__contains="name").filter(age=22).values_list()
Out[24]: [(2, 'name2', 22), (3, 'name3', 22), (4, 'name3',
 

 

 

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方法来解决



posted @ 2018-11-26 13:26  andyzhang-  阅读(174)  评论(0编辑  收藏  举报