python之路-Django

安装

1.pip3 install django

2.到官网下载安装包

执行:python3 setup.py install

3.windows上添加环境变量

在pyth中加入C:\Python35\Scripts(如果不添加,执行时就必须相应的文件夹下执行djingo-admin.exe)

基本操作

命令:

1.创建project

djingo-admin startproject mysite(项目的名字)创建目录

创建的mysite目录

mysite

  -mysite 内部都是些配置文件

  -manage.py 管理当前project

2.运行

传递

cd mysite

python3 manage.py runserver 127.0.0.1:8000

在浏览器上输入127.0.0.1:8000

3.创建app(app相当于一个项目中的各个模块,app处理业务逻辑)

例子:

project 运维平台

  配置文件

  管理文件

  app-01 资产管理

  app-02 监控

  ......

通过manage.py创建app

cd mysite

python manage.py startapp cmdb(名字)

创建完成后,进入到cmdb中就可以看到很多.py文件

其中migrations文件、modles.py(创建数据库,操作数据库)是操作数据库的

admin.pyh后台管理,配置的djingo自带的后台

apps.py 当前app的配置

tests.py 单元测试

views.py 业务处理

 

pycharm

新建project

pycharm会自动执行djingo-admin startproject mysite

创建app,点击pycharm的termial,执行python manage.py startapp cmdb(名字)

运行:python3 manage.py runserver 127.0.0.1:8000(terminal终端)或者点击pycharm中的绿色箭头

如果想编辑地址或者端口,点击箭头左边的project的名字,点击edit configrations

 

配置文件

数据库:jingo自带的数据库(sqlite)

如果想换成mysql,可以做如下修改

settings

 1 DATABASES = {
 2 
 3     'default': {
 4 
 5     'ENGINE': 'django.db.backends.mysql',
 6 
 7     'NAME':'dbname',
 8 
 9     'USER': 'root',
10 
11     'PASSWORD': 'xxx',
12 
13     'HOST': '',
14 
15     'PORT': '',
16 
17     }
18 
19 } 
数据库的更改

由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替

如下设置放置的与project同名的配置的 __init__.py文件中

import pymysql

pymysql.install_as_MySQLdb()

模版

1 TEMPLATE_DIRS = (
2 
3         os.path.join(BASE_DIR,'templates'),
4 
5     ) 
模板

静态文件

1 STATICFILES_DIRS = (
2 
3         os.path.join(BASE_DIR,'static'),
4 
5     ) 
静态文件

数据库的创建

在models.py中创建数据库

 创建类------》相当于表

类中的字段----》相当于表中的列

1 class UserInfo(models.Model):
2     nid = models.AutoField(primary_key=True)
3     username = models.CharField(max_length=32)
4     pwd = models.CharField(max_length=64)
5     age = models.IntegerField()
表的创建

写完后,要执行命令创建
在终端执行 cd /mysite

根据app的models.py生成数据库表
        python manage.py makemigrations
        python manage.py migrate

注意:要在settings注册app名字(通过app注册,控制都让那些app生成数据库表)

 

 

 

完成功能

建立的项目中会有几个文件

settings.py整体的配置文件

urls.py 网页的对应关系

wsgi.py djingo是基于wsgi开发的

例子:

urlpatterns = [ url(r'^admin/', admin.site.urls), 后面的admin.site.urls是一个函数,负责处理业务的,当url中匹配到前面的关键词后,这个函数开始处理请求。]

这个是djingo自带的后台管理,在url中加127.0.0.1:8001/admin

一般会把处理业务的函数放在app的views.py中

这里就需要先把app中的views导入到urls这个文件中

from cmdb import views

创建一个对应关系

urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/',views.index),         路由映射
]

在views中创建一个函数(标红为重要信息)


from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
def index(requst):
return HttpResponse('OK')

这个函数至少包含一个参数request,request封装了用户请求相关信息。,return后面返回的可以是一个网页,也可以去一个html文件中拿到,

如果想返回的是网页,就必须是return render(request,'index.html'),此时我们要告诉jingo网页的位置,去settings设置,找到TEMPLATES,

有个 'DIRS': [os.path.join(BASE_DIR, 'templates')],BASE_DIR就是创建项目的目录位置,下面有个templates目录,只要把html文件放到这里就可以了。

如果此时目录下面有个index.html就会找到了。

提交登陆页面

在同样的位置创建url路由映射,创建登陆网页,写登陆函数

1 urlpatterns = [
2     # url(r'^admin/', admin.site.urls),
3     url(r'^index/',views.index),
4     url(r'^login/', views.login),
5 ]
登陆映射
1 def login(request):
2     return render(request,'login.html')
登陆函数

登陆函数自己写

注意:我们提交网页的方式是以post方式提交的,此时,需要我们到settings中将MIDDLEWARE下的'django.middleware.csrf.CsrfViewMiddleware'注释掉,否则无法提交。

接下来,我们就要对用户提交的数据进行验证

需要对登陆函数进行完善(render里写的是模版,redirect写的是url)

 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from django.shortcuts import redirect
 4 
 5 # Create your views here.
 6 def index(request):
 7     # return HttpResponse('OK')
 8     return render(request,'index.html')
 9 def login(request):
10     #request.method  "GET" "POST" 用户已什么方式提交,就以什么方式获取
11     if request.method == 'GET':
12         return render(request,'login.html')
13     elif request.method == 'POST':
14         #获取用户提交的数据(以字典的防护死提交)
15         username = request.POST.get('user')     #此处用get获取而不用 request.POST[user]是防止没有找到数据是报错
16         password = request.POST.get('pwd')
17         if username == 'root' and password == '111111':
18             # return redirect('http://www.baidu.com')
19             return redirect('/index/')  #这里写的相当于路径,在127.0.0.18001/index/
20         else:
21             return render(request,'login.html')
登陆函数

实现数据的读取,以及添加

 

 1.读取html文件内容

        将特殊的标记和{'data':DB}进行渲染,得到一个字符串

 2.将html内容返回给用户

 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from django.shortcuts import redirect
 4 DB = [
 5     {'hostname':'c1.com','port':80},
 6     {'hostname':'c2.com','port': 81},
 7     {'hostname':'c3.com','port': 82},
 8     {'hostname':'c4.com','port': 83},
 9 ]
10 # Create your views here.
11 def index(request):
12     # return HttpResponse('OK')
13     if request.method == 'GET':
14         #用户获取数据 pymysql
15         #模版渲染
16         return render(request,'index.html',{'data':DB})
17     """
18     1.读取html文件内容
19         将特殊的标记和{'data':DB}进行渲染,得到一个字符串
20     2.将html内容返回给用户
21     """
22     if request.method == 'POST':
23         host = request.POST.get('host')
24         port = request.POST.get('port')
25         temp = {'hostname':host,'port':port}
26         DB.append(temp)
27         return render(request, 'index.html', {'data': DB}) #再次渲染即可
28 def login(request):
29     #request.method  "GET" "POST" 用户已什么方式提交,就以什么方式获取
30     if request.method == 'GET':
31         #用户获取数据 pymysql
32         #模版渲染
33         return render(request,'index.html',{'data':DB})
34         return render(request,'login.html')
35     elif request.method == 'POST':
36         #获取用户提交的数据(以字典的防护死提交)
37         username = request.POST.get('user')     #此处用get获取而不用 request.POST[user]是防止没有找到数据是报错
38         password = request.POST.get('pwd')
39         if username == 'root' and password == '111111':
40             # return redirect('http://www.baidu.com')
41             return redirect('/index/')  #这里写的相当于路径,在127.0.0.18001/index/
42         else:
43             return render(request,'login.html')
Views的配置
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5         <title>Title</title>
 6     </head>
 7     <body>
 8         <h1>欢迎登陆</h1>
 9         <h3>添加内容</h3>
10         <form action="/index/" method="POST">
11             <input type="text" placeholder="主机名" name="host" />
12             <input type="text" placeholder="端口" name="port" />
13             <input type="submit" value="增加" />
14         </form>
15         <h3>资产列表</h3>
16         <table border="1">
17             <thead>
18                 <tr>
19                     <th>主机名</th>
20                     <th>端口</th>
21                 </tr>
22             </thead>
23             <tbody>
24                 {% for row in data %}
25                     <tr>
26                     <td>{{row.hostname}}</td>
27                     <td>{{row.port}}</td>
28                     </tr>
29                 {% endfor %}
30             </tbody>
31         </table>
32     </body>
33 </html>
index的配置

静态文件的设置

1.要在project的目录下建立一个静态文件,和app目录在同一界别

2.在网页加入文件链接

3. 接下来就要告诉jingo文件的位置,在settings中最下面添加

STATICFILES_DIRS = (

    os.path.join(BASE_DIR,'static'),

)

这个是元组,必须要有逗号

 

创建表

在项目中的models中操作

 1 from __future__ import unicode_literals
 2 
 3 from django.db import models
 4 
 5 # Create your models here.
 6 class UserInfo(models.Model):
 7     nid = models.AutoField(primary_key=True)
 8     username = models.CharField(max_length=32)
 9     pwd = models.CharField(max_length=64)
10     age = models.IntegerField()
创建表

执行命令,生成表

python manage.py makemigrations
python manage.py migrate

创建完数据库后提取数据

models.tb.objects.all()
models.tb.objects.filter(nid=1)
models.tb.objects.filter(nid=1).first()

也可以将filter换为get,但是get只适用于单个数据,如果有多个查询结果,就会报错

只想查看表中个别字段中的内容:

models.Book.objects.values('name','price')

models.Book.objects.exclude(name='py')反查询

 

1 def users(request):
2     users_list = models.UserInfo.objects.all()
3     return render(request,'users.html',{'data':users_list})
views
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>用户列表</h1>
 9     <ul>
10         {% for row in data %}      #这里循环的东西一定是字典的key
11         <li>
12         {{ row.nid}} - {{ row.username }} -
13         {{ row.pwd }}- {{ row.age }} -
14         </li>
15         {% endfor %}
16     </ul>
17 </body>
18 </html>
users.html

数据的增加

 models.tb.objects.create(...)
            
obj = models.tb(...)
obj.save()

 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from A1 import models
 4 from django.shortcuts import redirect
 5 # Create your views here.
 6 def users(request):
 7     users_list = models.UserInfo.objects.all()
 8     return render(request,'users.html',{'data':users_list})
 9 def add_user(request):
10     if request.method == 'GET':
11         return render(request,'add_user.html ')
12     elif request.method == 'POST':
13         u = request.POST.get('user')
14         p = request.POST.get('pwd')
15         a = request.POST.get('age')
16         # obj = models.UserInfo(username=u,pwd=p,age=a)
17         # obj.save()
18         models.UserInfo.objects.create(username=u,pwd=p,age=a)
19         return redirect('/users')
views
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form method="POST" action="/add_user">
 9         <input type="text" name="user" placeholder="用户名" />
10         <input type="text" name="pwd" placeholder="密码" />
11         <input type="text" name="age" placeholder="年龄" />
12         <input type="submit" value="提交">
13 
14     </form>
15 </body>
16 </html>
add_users.html
urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^users', views.users),
    url(r'^add_user',views.add_user),
]
urls

添加按钮,需要跳转,通过a标签的href,href='/add_user'

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>用户列表</h1>
 9     <a href="/add_user">添加</a>
10     <ul>
11         {% for row in data %}
12         <li>
13         {{ row.nid}} - {{ row.username }} -
14         {{ row.pwd }}- {{ row.age }} -
15         </li>
16         {% endfor %}
17     </ul>
18 </body>
19 </html>
添加按钮

数据的删除

 models.tb.objects.all().delete()
 models.tb.objects.filter(nid=1).delete()

 1 views
 2 from django.shortcuts import render
 3 from django.shortcuts import HttpResponse
 4 from A1 import models
 5 from django.shortcuts import redirect
 6 # Create your views here.
 7 def users(request):
 8     users_list = models.UserInfo.objects.all()
 9     return render(request,'users.html',{'data':users_list})
10 def add_user(request):
11     if request.method == 'GET':
12         return render(request,'add_user.html ')
13     elif request.method == 'POST':
14         u = request.POST.get('user')
15         p = request.POST.get('pwd')
16         a = request.POST.get('age')
17         # obj = models.UserInfo(username=u,pwd=p,age=a)
18         # obj.save()
19         models.UserInfo.objects.create(username=u,pwd=p,age=a)
20         return redirect('/users')
21 def delete_user(request):
22     nnid = request.GET.get('nid')
23     models.UserInfo.objects.filter(nid=nnid).delete()      但凡遇到fileter、all时,获取的是列表
views
1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^users', views.users),
4     url(r'^add_user', views.add_user),
5     url(r'^delete_user',views.delete_user),
6 ]
urls
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>用户列表</h1>
 9     <a href="/add_user">添加</a>
10     <ul>
11         {% for row in data %}
12         <li>
13         {{ row.nid}} - {{ row.username }} -
14         {{ row.pwd }}- {{ row.age }} -
15             <a href="/delete_user?nid={{ row.nid }}">删除</a>   #此处书写类似于网页地址形式,以get形式传值
16         </li>
17         {% endfor %}
18     </ul>
19 </body>
20 </html>
添加删除按钮

数据的修改

models.tb.objects.all().update(...)
models.tb.objects.filter(nid=1).update(...)

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^users', views.users),
4     url(r'^add_user', views.add_user),
5     url(r'^delete_user',views.delete_user),
6     url(r'^edit_user',views.edit_user),
7 ]
urls
 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from A1 import models
 4 from django.shortcuts import redirect
 5 # Create your views here.
 6 def users(request):
 7     users_list = models.UserInfo.objects.all()
 8     return render(request,'users.html',{'data':users_list})
 9 def add_user(request):
10     if request.method == 'GET':
11         return render(request,'add_user.html ')
12     elif request.method == 'POST':
13         u = request.POST.get('user')
14         p = request.POST.get('pwd')
15         a = request.POST.get('age')
16         # obj = models.UserInfo(username=u,pwd=p,age=a)
17         # obj.save()
18         models.UserInfo.objects.create(username=u,pwd=p,age=a)
19         return redirect('/users')
20 def delete_user(request):
21     nnid = request.GET.get('nid')
22     models.UserInfo.objects.filter(nid=nnid).delete()
23     return redirect('/users')
24 def edit_user(request):
25     if request.method == 'GET':
26         nnid = request.GET.get('nid')
27         v = models.UserInfo.objects.filter(nid=nnid).first()    #首先通过nid获取,所有的值,然后通过render将之给html,并进行渲染
28         return render(request,'edit_user.html',{'obj':v})
29     elif request.method == 'POST':                              #将提交的数据提取,并到数据库更新
30         nnid = request.POST.get('nid')
31         u = request.POST.get('user')
32         p = request.POST.get('pwd')
33         a = request.POST.get('age')
34         models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a)
35         return redirect('/users')
views
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/edit_user" method="POST">
 9         <p style="display: none"><input type="text" name="nid" value="{{ obj.nid }}"></p>     #通过values将值默认添加到文本框汇总。我们要通过nid更新至,但是不能让用户看到
10         <input type="text" name="user" placeholder="用户名" value="{{ obj.username }}" />
11         <input type="text" name="pwd" placeholder="密码" value="{{ obj.pwd }}" />
12         <input type="text" name="age" placeholder="年龄" value="{{ obj.age}}" />
13         <input type="submit" value="提交">
14 
15     </form>
16 
17 </body>
18 </html>
edit_user.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>用户列表</h1>
 9     <a href="/add_user">添加</a>
10     <ul>
11         {% for row in data %}
12         <li>
13         {{ row.nid}} - {{ row.username }} -
14         {{ row.pwd }}- {{ row.age }} -
15             <a href="/delete_user?nid={{ row.nid }}">删除</a> -
16             <a href="edit_user?nid={{ row.nid }}">编辑</a>
17         </li>
18         {% endfor %}
19     </ul>
20 </body>
21 </html>
添加编辑按钮

写urls时,通过正则表达式来实现动态的路由系统

1.^users$,来精确匹配

2.users.html 来匹配,伪造成静态页面
3. url(r'^edit_user_new-(?P<nnid>\d+).html$', views.edit_user_new)

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^users$', views.users),
4     url(r'^add_user$', views.add_user),
5     url(r'^delete_user$',views.delete_user),
6     url(r'^edit_user$',views.edit_user),
7     url(r'^edit_user_new-(?P<nnid>\d+).html$',views.edit_user_new),
8 ]
urls

注意:如果r'^add_user$'如果add_user首尾不加控制,那么r'^edit_user_new-(?P<nnid>\d+).html$就永远执行不了,如果不加,
只要匹配到add_user就会执行第一个

 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from A1 import models
 4 from django.shortcuts import redirect
 5 # Create your views here.
 6 def users(request):
 7     users_list = models.UserInfo.objects.all()
 8     return render(request,'users.html',{'data':users_list})
 9 def add_user(request):
10     if request.method == 'GET':
11         return render(request,'add_user.html ')
12     elif request.method == 'POST':
13         u = request.POST.get('user')
14         p = request.POST.get('pwd')
15         a = request.POST.get('age')
16         # obj = models.UserInfo(username=u,pwd=p,age=a)
17         # obj.save()
18         models.UserInfo.objects.create(username=u,pwd=p,age=a)
19         return redirect('/users')
20 def delete_user(request):
21     nnid = request.GET.get('nid')
22     models.UserInfo.objects.filter(nid=nnid).delete()
23     return redirect('/users')
24 def edit_user(request):
25     if request.method == 'GET':
26         nnid = request.GET.get('nid')
27         v = models.UserInfo.objects.filter(nid=nnid).first()
28         return render(request,'edit_user.html',{'obj':v})
29     elif request.method == 'POST':
30         nnid = request.POST.get('nid')
31         u = request.POST.get('user')
32         p = request.POST.get('pwd')
33         a = request.POST.get('age')
34         models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a)
35         return redirect('/users')
36 def edit_user_new(request,nnid):   如果是动态路径,此处需要加参数,这个参数与路由系统中nnid所对应
37     if request.method == 'GET':    下面一部就不用获取nid了,因为在路径中已经获取了。
38         v = models.UserInfo.objects.filter(nid=nnid).first()
39         return render(request,'edit_user_new.html',{'obj':v})
40     elif request.method == 'POST':
41         u = request.POST.get('user')
42         p = request.POST.get('pwd')
43         a = request.POST.get('age')
44         models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a)
45         return redirect('/users')
views
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>新编辑</h1>
 9     <form action="/edit_user_new-{{ obj.nid }}.html" method="POST">   由于已经回去了nid,这样就不用再次获取nid,所以也没必要隐藏了。
10         <input type="text" name="user" placeholder="用户名" value="{{ obj.username }}" />
11         <input type="text" name="pwd" placeholder="密码" value="{{ obj.pwd }}" />
12         <input type="text" name="age" placeholder="年龄" value="{{ obj.age}}" />
13         <input type="submit" value="提交">
14 
15     </form>
16 
17 
18 </body>
19 </html>
edit_user_new.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <h1>用户列表</h1>
 9     <a href="/add_user">添加</a>
10     <ul>
11         {% for row in data %}
12         <li>
13         {{ row.nid}} - {{ row.username }} -
14         {{ row.pwd }}- {{ row.age }} -
15             <a href="/delete_user?nid={{ row.nid }}">删除</a> -
16             <a href="/edit_user?nid={{ row.nid }}">编辑</a> -
17             <a href="/edit_user_new-{{ row.nid }}.html">新编辑</a>
18         </li>
19         {% endfor %}
20     </ul>
21 </body>
22 </html>
增加新编辑按钮

1.url(r'^edit_user_new-(\d+).html$', views.edit_user_new,name='bbb'),
{% url "bbb" 1 %} ==> edit_user_new-1.html 位置在相应html的form表单中的action
2. url(r'^edit_user_new-(?P<nnid>\d+).html$', views.edit_user_new, name='nnn'),
{% url "nnn" nnid=1 %} ==> edit_user_new-1.html

url的分发

多个app时,防止urls出错,各自写在自己的urls中

导入include模块

主urls
url(r'^A2/',include('A2.urls')),
url(r'^A3/',include('A3.urls')),

A2 urls

from django.conf.urls import url, include
from django.contrib import admin
from A2 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),

]

A2 views
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def test(request):
return HttpResponse('A2.test')


A3 urls

from django.conf.urls import url, include
from django.contrib import admin
from A3 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),

]

A3 views
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def test(request):
return HttpResponse('A3.test')

 

视图函数 views.py    

获取请求信息:        

request.POST  {'username':'root'..}   对request.body的处理。        

request.GET        

request.FILES        

request.method        

request.body = username=root;age=18;gender=male

request.FILES实例

1 from django.conf.urls import url, include
2 from django.contrib import admin
3 from A2 import views
4 urlpatterns = [
5     url(r'^admin/', admin.site.urls),
6     url(r'^test/', views.test),
7     url(r'^upload', views.upload),
8 
9 ]
urls
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/A2/upload" method="POST" enctype="multipart/form-data">
 9         <input type="file" name="fafafa" />
10         <input type="submit" value="提交">
11     </form>
12 
13 </body>
14 </html>
upload.html
 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 # Create your views here.
 4 def test(request):
 5     return HttpResponse('A2.test')
 6 def upload(request):
 7     if request.method == 'GET':
 8         return render(request,'upload.html')
 9     elif request.method == 'POST':
10         obj = request.FILES.get('fafafa')    #获取文件的方式
11         import os
12         f = open(os.path.join('upload',obj.name),'wb')
13         for line in obj.chunks():   #chunks是个迭代器
14             f.write(line)
15         f.close()
16         return HttpResponse('ok')
views

 响应结果:        

return HttpReponse(..)        

return render(request,'path/a.html',{})        

return redirect('http://www.baidu.com')    

模板引擎

本质上就是做替换

特殊规则:
- 1
{{k1}}       获取单值,

- 2
{% if a == 123 %}

{% else %}

{% endif %}

- 3
{% for item in LIST %}
{{item}}
{% endfor %}
- 4
# 索引:字典.k1 列表.1     只能是点,没有类似于字典或者列表的那种取值方法

- 5.自定义模板方法
- filter: 在if条件中做条件时
- simple_tag: 在页面仅显示内容时

- 6. extends
- 模板的继承 

在基础模板中留有继承的位置,用{% block body %}和{% endblock %}所包含的内容替换基础模板中{% block body %}和{% endblock %}的位置。

- 7. include
- 导入公共组件
       

方法:

  • {{ item.event_start|date:"Y-m-d H:i:s"}}  将日期格式变为引号中的格式。
  • {{ bio|truncatewords:"30" }}                   截取前30个单词

urls

url(r'^tpl',views.tpl),

views

def tpl(request):
return render(request,'tpl.html',{'summary':'wewewewewewew'})

 

tpl.html


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ summary }}
<br/>
{{ summary | truncatechars:8 }}
</body>
</html>

 

自定义simple_tag

比如我想创建一个{{ summary | ji}}的方法

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

url(r'^tpl',views.tpl),
1 from django import template
2 register = template.Library()
3 @register.filter
4 def ji(value):
5     return 'jijiji'
xxoo.py

如果在文件中写入value值,那么ji前面的summary就会没当作参数传入进去

{{ summary | ji}}

@register.filter    filter只能穿两个值
def ji(value):
return 'jijiji----->' + value  ,此时summary对应的值就会被传进去,value就对应的是ji前面的summary

c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

如果是{{ summary | ji:8}},就表示可以传入两个参数

def ji(value,num):
return 'jijiji----->' + value  +str(num)

最多能加两个参数

 1 {% load xxoo %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9     {{ summary }}
10     <br/>
11     {{ summary | truncatechars:8 }}
12     <br/>
13     {{ summary | ji}}
14 </body>
15 </html>
tpl.html

d、使用simple_tag

e、在settings中配置当前app,不然django无法找到自定义的simple_tag

作用:

from django.utils.safestring import mark_safe  #导入这个模块就是将tmp转化为html的格式

 1 from django import template
 2 register = template.Library()
 3 from django.utils.safestring import mark_safe
 4 @register.filter
 5 def ji(value,num):
 6     return 'jijiji----->' + value + str(num)
 7 @register.filter
 8 def ya(value,num):
 9     #value就是跳转
10     #num 就是8
11     tmp = "<a href='http://www.baidu.com?t=%s'>%s</a>" %(num,value,)
12     return mark_safe(tmp)
xxoo.py
 1 {% load xxoo %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>Title</title>
 7 </head>
 8 <body>
 9     {{ summary }}
10     <br/>
11     {{ summary | truncatechars:8 }}
12     <br/>
13     {{ summary | ji:8}}
14     <br/>
15     {{ '跳转'| ya:8 }}
16 </body>
17 </html>
tpl.html

 实例:模版的继承

不同页面,有相同的元素。

一般预留位置有3个,一个是内容,一个是css,一个是js。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <style>
 7         body{
 8             margin: 0;
 9         }
10         .pg-header{
11             height: 48px;
12             background-color: green;
13             color: white;
14         }
15         .pg-body .menus{
16             width: 20%;
17             float: left;
18             background-color: black;
19             height: 500px;
20         }
21         .pg-body .contents{
22             width: 80%;
23             float: left;
24         }
25     </style>
26     {% block css %}{% endblock %}
27 </head>
28 <body>
29     <div class="pg-header">
30         LLLLLLL
31     </div>
32     <div class="pg-body">
33         <div class="menus"></div>
34         <div class="contents">
35             {% block bd %}{% endblock %}
36         </div>
37     </div>
38     {% block js %}{% endblock %}
39 </body>
40 </html>
公用模版
 1 {% extends 'layout.html' %}
 2 
 3 {% block css %}
 4     <style>
 5 
 6     </style>
 7 {% endblock %}
 8 
 9 {% block bd %}
10     <h1>组列表</h1>
11     ...
12 {% endblock %}
13 
14 
15 {% block js %}
16     <script></script>
17 {% endblock %}
继承公用模版

引用那个内容,要写相应的名字。

公共组件,比如有分页,点下一页,页面变化,但是下面的分页不变

写入到另一个页面,通过include解决

1 <div>
2     <a>上一页</a>
3     <a>1</a>
4     <a>2</a>
5     <a>3</a>
6     <a>4</a>
7     <a>下一页</a>
8 </div>
写入新的小组件
 1 {% extends 'layout.html' %}
 2 
 3 {% block css %}
 4     <style>
 5 
 6     </style>
 7 {% endblock %}
 8 
 9 {% block bd %}
10     <h1>组列表</h1>
11     ...
12     {% include 'pager.html' %}
13 {% endblock %}
14 
15 
16 {% block js %}
17     <script></script>
18 {% endblock %}
include导入

Cookie 

- 是用户浏览器上的一个键值对        

- 设置超时时间        

利用cookie可实现:        

- 登录验证        

-页面显示条数        

- 拖动位置..

-显示内容,可以选择显示10条,20条.......

例子:

urls


url(r'^login$',views.login),

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <form action="/login" method="POST">
 9         <input type="text" name="user" />
10         <input type="password" name="pwd" />
11         <input type="submit" value="登陆" /> {{ msg }}
12     </form>
13 </body>
14 </html>
login.html
 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from A1 import models
 4 from django.shortcuts import redirect
 5 # Create your views here.
 6 def users(request):
 7     #摸口袋,有可以执行,没有重定向到login页面
 8     v = request.COOKIES.get('user_name')
 9     if not v:
10         return redirect('/login')
11 
12 
13 
14     users_list = models.UserInfo.objects.all()
15     return render(request,'users.html',{'data':users_list})
16 def add_user(request):
17     if request.method == 'GET':
18         return render(request,'add_user.html ')
19     elif request.method == 'POST':
20         u = request.POST.get('user')
21         p = request.POST.get('pwd')
22         a = request.POST.get('age')
23         # obj = models.UserInfo(username=u,pwd=p,age=a)
24         # obj.save()
25         models.UserInfo.objects.create(username=u,pwd=p,age=a)
26         return redirect('/users')
27 def delete_user(request):
28     nnid = request.GET.get('nid')
29     models.UserInfo.objects.filter(nid=nnid).delete()
30     return redirect('/users')
31 def edit_user(request):
32     if request.method == 'GET':
33         nnid = request.GET.get('nid')
34         v = models.UserInfo.objects.filter(nid=nnid).first()
35         return render(request,'edit_user.html',{'obj':v})
36     elif request.method == 'POST':
37         nnid = request.POST.get('nid')
38         u = request.POST.get('user')
39         p = request.POST.get('pwd')
40         a = request.POST.get('age')
41         models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a)
42         return redirect('/users')
43 def edit_user_new(request,nnid):
44     if request.method == 'GET':
45         v = models.UserInfo.objects.filter(nid=nnid).first()
46         return render(request,'edit_user_new.html',{'obj':v})
47     elif request.method == 'POST':
48         u = request.POST.get('user')
49         p = request.POST.get('pwd')
50         a = request.POST.get('age')
51         models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a)
52         return redirect('/users')
53 def tpl(request):
54     return render(request,'tpl.html',{'summary':'wewewewewewew'})
55 
56 def login(request):
57     if request.method == 'GET':
58         return render(request,'login.html')
59     elif request.method == 'POST':
60         u = request.POST.get('user')
61         p = request.POST.get('pwd')
62         obj = models.UserInfo.objects.filter(username=u,pwd=p).first()
63         if obj:
64             #在请求这口袋放东西
65             obj = redirect('/users')
66             obj.set_cookie(key='user_name',value=u,max_age=10,)#max_age 超时时间,expires当前时间,path,在那个url下生效,比如path=/index,只有index页面过来才能生效,不写默认是全局,httponly=True,http传输secure=True,https传输
67 
68             return obj
69         else:
70             return render(request,'login.html',{'msg':'用户名或密码错误'})
views

 

   

两大忌讳:   

      - 敏感信息   

      - 简单

Session    

- 放置在服务器端的键值对    

随机字符串,双方都有,用户登陆时,会拿随机字符串,但并不认为登陆成功,要与自己服务器上的字符串进行比对。    

session = {         'asdfasdfasd': {'username':'hailong'},         'asdfasdfasdf': {username:'feinikesi'},     }      

views会有变动

 1 from django.shortcuts import render
 2 from django.shortcuts import HttpResponse
 3 from A1 import models
 4 from django.shortcuts import redirect
 5 # Create your views here.
 6 def users(request):
 7     #摸口袋,有可以执行,没有重定向到login页面
 8     # v = request.COOKIES.get('user_name')
 9     v = request.session.get('user_name')
10     if not v:
11         return redirect('/login')
12 
13 
14 
15     users_list = models.UserInfo.objects.all()
16     return render(request,'users.html',{'data':users_list})
17 def add_user(request):
18     if request.method == 'GET':
19         return render(request,'add_user.html ')
20     elif request.method == 'POST':
21         u = request.POST.get('user')
22         p = request.POST.get('pwd')
23         a = request.POST.get('age')
24         # obj = models.UserInfo(username=u,pwd=p,age=a)
25         # obj.save()
26         models.UserInfo.objects.create(username=u,pwd=p,age=a)
27         return redirect('/users')
28 def delete_user(request):
29     nnid = request.GET.get('nid')
30     models.UserInfo.objects.filter(nid=nnid).delete()
31     return redirect('/users')
32 def edit_user(request):
33     if request.method == 'GET':
34         nnid = request.GET.get('nid')
35         v = models.UserInfo.objects.filter(nid=nnid).first()
36         return render(request,'edit_user.html',{'obj':v})
37     elif request.method == 'POST':
38         nnid = request.POST.get('nid')
39         u = request.POST.get('user')
40         p = request.POST.get('pwd')
41         a = request.POST.get('age')
42         models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a)
43         return redirect('/users')
44 def edit_user_new(request,nnid):
45     if request.method == 'GET':
46         v = models.UserInfo.objects.filter(nid=nnid).first()
47         return render(request,'edit_user_new.html',{'obj':v})
48     elif request.method == 'POST':
49         u = request.POST.get('user')
50         p = request.POST.get('pwd')
51         a = request.POST.get('age')
52         models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a)
53         return redirect('/users')
54 def tpl(request):
55     return render(request,'tpl.html',{'summary':'wewewewewewew'})
56 
57 def login(request):
58     if request.method == 'GET':
59         return render(request,'login.html')
60     elif request.method == 'POST':
61         u = request.POST.get('user')
62         p = request.POST.get('pwd')
63         obj = models.UserInfo.objects.filter(username=u,pwd=p).first()
64         if obj:
65             #在请求这口袋放东西
66             obj = redirect('/users')
67             # obj.set_cookie(key='user_name',value=u,max_age=10,)#max_age 超时时间,expires当前时间,path,在那个url下生效,比如path=/index,只有index页面过来才能生效,不写默认是全局,httponly=True,http传输secure=True,https传输
68             request.session['user_name'] = u
69             return obj
70         else:
71             return render(request,'login.html',{'msg':'用户名或密码错误'})
session views

django的session字符串默认放在数据库中

session的配置

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

数据库

  1 Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
  2 
  3  
  4 
  5 a. 配置 settings.py
  6 
  7  
  8 
  9     SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
 10 
 11      
 12 
 13     SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
 14 
 15     SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
 16 
 17     SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
 18 
 19     SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
 20 
 21     SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
 22 
 23     SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
 24 
 25     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
 26 
 27     SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
 28 
 29  
 30 
 31  
 32 
 33  
 34 
 35 b. 使用
 36 
 37  
 38 
 39     def index(request):
 40 
 41         # 获取、设置、删除Session中数据
 42 
 43         request.session['k1']
 44 
 45         request.session.get('k1',None)
 46 
 47         request.session['k1'] = 123
 48 
 49         request.session.setdefault('k1',123) # 存在则不设置
 50 
 51         del request.session['k1']
 52 
 53  
 54 
 55         # 所有 键、值、键值对
 56 
 57         request.session.keys()
 58 
 59         request.session.values()
 60 
 61         request.session.items()
 62 
 63         request.session.iterkeys()
 64 
 65         request.session.itervalues()
 66 
 67         request.session.iteritems()
 68 
 69  
 70 
 71  
 72 
 73         # 用户session的随机字符串
 74 
 75         request.session.session_key
 76 
 77  
 78 
 79         # 将所有Session失效日期小于当前日期的数据删除
 80 
 81         request.session.clear_expired()
 82 
 83  
 84 
 85         # 检查 用户session的随机字符串 在数据库中是否
 86 
 87         request.session.exists("session_key")
 88 
 89  
 90 
 91         # 删除当前用户的所有Session数据
 92 
 93         request.session.delete("session_key")
 94 
 95  
 96 
 97         request.session.set_expiry(value)
 98 
 99             * 如果value是个整数,session会在些秒数后失效。
100 
101             * 如果value是个datatime或timedelta,session就会在这个时间后失效。
102 
103             * 如果value是0,用户关闭浏览器session就会失效。
104 
105             * 如果value是None,session会依赖全局session失效策略。
session的配置

缓存

 1 a. 配置 settings.py
 2 
 3  
 4 
 5     SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
 6 
 7     SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 8 
 9  
10 
11  
12 
13     SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
14 
15     SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
16 
17     SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
18 
19     SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
20 
21     SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
22 
23     SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
24 
25     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
26 
27     SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存
28 
29  
30 
31  
32 
33  
34 
35 b. 使用
36 
37  
38 
39     同上
View Code

文件Session

 1 a. 配置 settings.py
 2 
 3  
 4 
 5     SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
 6 
 7     SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 
 8 
 9  
10 
11  
12 
13     SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
14 
15     SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
16 
17     SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
18 
19     SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
20 
21     SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
22 
23     SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
24 
25     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
26 
27     SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存
28 
29  
30 
31 b. 使用
32 
33  
34 
35     同上
View Code

缓存+数据库Session

 1 数据库用于做持久化,缓存用于提高效率
 2 
 3  
 4 
 5 a. 配置 settings.py
 6 
 7  
 8 
 9     SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
10 
11  
12 
13 b. 使用
14 
15  
16 
17     同上
View Code

加密cookie Session

 1 a. 配置 settings.py
 2 
 3      
 4 
 5     SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
 6 
 7  
 8 
 9 b. 使用
10 
11  
12 
13     同上
View Code

 

 

      

 

转载于:https://www.cnblogs.com/l-w-q/p/6516008.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值