victory的博客

长安一片月,万户捣衣声

0%

django中两种模板目录设置

在进行django项目开发中,我们需要创建一个用于存放模板的文件夹,模板文件夹通常放在以下两个位置之一。
第一种的项目目录为蓝色框所框选的目录,第二种的项目目录为红色框所框选的目录。

位置(1)的优缺点:

优点: 便于移植(首次开发完application应用,可将application应用移植到其他项目)
缺点: 项目下的每个应用都有一个templates文件夹,不便于管理

位置(2)的优缺点:

优点: 便于管理模板文件
缺点: 不方便移植到其他项目中

session实现用户登录

下面将使用session实现用户登录,如下图所示效果:

步骤:

1.在views.py文件中创建视图(假定我们创建了一个名为booktest的应用)

def index(request):
    uname = request.session.get('myname', default='未登录')
    context = {'uname': uname}
    return render(request, 'booktest/index.html', context)


def login(request):
    return render(request, 'booktest/login.html')


def login_handle(request):
    uname = request.POST['uname']
    request.session['myname'] = uname
    return redirect('/booktest/index/')


def logout(request):
    # del request.session['myname']  # 删除会话
    # request.session.clear()  # 清除所有会话
    request.session.flush()  # 删除当前的会话数据并删除会话的Cookie
    return redirect('/booktest/index/')

2.配置url

主url:
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^booktest/', include("booktest.urls", namespace='booktest')),
]
应用url:
from django.conf.urls import include, url
import views


urlpatterns = [
    url(r'^index/$', views.index),
    url(r'^login/$', views.login),
    url(r'^login_handle/$', views.login_handle),
    url(r'^logout/$', views.logout3),

]

3.创建模板

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
你好:{{ uname }}
<br>
<a href="/booktest/session2/">登录</a>
<br>
<a href="/booktest/session3/">退出</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/booktest/session2_handle/">
    <input type="text" name="uname">
    <input type="submit" name="登录">
</form>
</body>
</html>

4.配置模板路径DIRS
注:templates为和应用同级的文件夹,本应用的模板存在templates/booktest/下

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',
            ],
        },
    },
]

在基于HTTP的请求当中,客户端发送请求到服务器端,服务器端响应请求返回一些信息(包含cookie)。
1.cookie是什么?
cookie:存储在浏览器当中的文本信息,存储格式:键值对,一旦你访问某个网站,存储了这个键值对,后面再次请求这个服务器时,cookie会自动加到请求报文的头里面发送到服务器。

2.cookie是怎么来的?
我们在服务器端设置(set_cookie())的,通过response返回到浏览器,浏览器将cookie存储下来
注:cookie是区别于域名的,跨域名不能共享cookie信息
3.一种常见的场景
假设我们在淘宝网站浏览了运动鞋商品,在我们浏览其他网站时会看到与我们之前浏览的运动鞋类似的商品推荐,
“cookie是区别于域名的”,这句话似乎错了??
答:此时的现象并不是其他网站读取了淘宝网站的cookie,而是在其他网站内嵌了淘宝网站,即此时的运动鞋商品
推荐的信息是从淘宝网站本身读取到的,原理如下图所示:

django自定义错误页面

在进行django项目开发时,如果用户请求一个不存在的页面,将会显示以下界面:

我们可以自定义一个错误页面来展示提示信息。

django版本:1.8.2

步骤:
1.修改settings.py

DEBUG = False
ALLOWED_HOSTS = ['*']

2.在templates文件夹下创建404.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
找不到了
<hr/>
{{ request_path }}
</body>
</html>

3.运行服务器,访问一个不存在的页面,将显示自定义的错误页面

Django模型查询

查询集的两个特性:

1.惰性执行
创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
2.缓存
case1:构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互

print([e.attr for e in Entry.objects.all()])
print([e.attr for e in Entry.objects.all()])

case2:两次循环使用同一个查询集,第二次使用缓存中的数据

querylist=ExampleModel.objects.all()
print([e.attr for e in querylist])
print([e.attr for e in querylist])

case3:何时查询集不会被缓存
对整个查询集的子集进行求值时不会缓存

query=ExampleModel.objects.all()
for ... in query[0:10]
for ... in query[11:20]

字段查询

实现where子名,作为方法filter()、exclude()、get()的参数
语法:属性名称__比较运算符=值
举例:查询模型类中属性attr1包含1的对象
query_list = ExampleModel.objects.filter(attr1__contains=’1’)

比较运算符:
exact、contains、startswith、endswith、isnull、isnotnull、gt、gte、lt、lte、year、
month、day、week_day、hour、minute、second
注:跨关联查询(语法:模型类名__属性名__比较运算符)

聚合函数:
aggregate(Avg()/Count/Max/Min/Sum)

F对象和Q对象

1.通过构造F对象来比较模型中的两个列
举例:query_list = ExampleModel.objects.filter(attr1=F(‘attr2’))
2.通过构造Q对象来实现or查询
举例:query_list = ExampleModel.objects.filter(Q(pk__lt=6) | Q(attr__gt=1))

Django中使用MySQL数据库

1.在虚拟环境中安装mysql包

pip install mysql-python

2.在mysql中创建数据库

create databases database_name charset=utf8

3.在settings.py中修改DATABASES项

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'root',
        'PASSWORD': '1234',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

4.开发流程
1)在models.py中定义模型类(继承models.Model)

class Example(models.Model):
    field1 = 
    field2 = 
    ...

2)把应用加入settings.py文件的installed_app项

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_name',
)

3)生成迁移文件

python manage.py makemigrations

4)执行迁移生成表

python manage.py migrate

5)使用模型类进行crud操作

注:
使用数据库生成模型类
python manage.py inspectdb > app_name/models.py