Django学习_Day19


基本配置

 python3 manage.py runserver 127.0.0.1:8000  启动服务

python3 manage.py startapp cmdb
python3 manage.py startapp monitor  创建app

路由


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

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^cmdb/', include('cmdb.urls')),
url(r'^monitor/', include('monitor.urls')),

url(r'^detail-(d+)/',def detail(request,nid))),

]

static文件配置

STATIC_URL = '/static/'
STATICFILES_DIR=(os.path.join(BASE_DIR,'static'),)

views配置

1.至少一个参数:request

2.request 包含请求的所有信息

request.get  去请求头里面拿数据

request.post  去请求体里面拿数据,也就是去request.body里面取值

request.body  请求体里面原生的值,如果post里面没有数据,就去body里面找

request.FILES  取文件

3. 处理完给用户返回

return  HttpResponse(..)   #返回字典或数据         return HttpResponse(json.dumps(task_result,default=date_handler))

return render  把当前获取到的值,返回到html渲染

return  render(request,"new_article.html",{"form":article_form})

return render(request,'multitask_file.html',locals())     

return render(request,'index.html')

locals()返回一个包含当前作用域里面的所有变量和它们的值的字典

return redirect()  后面跟具体的请求路径        return redirect("/category/all/")

1 from django.shortcuts import render
2 from django.shortcuts import redirect
3 from django.shortcuts import HttpResponse
4 from cmdb import models
5 
6 # Create your views here.
7 def users(request):
8     return HttpResponse('OK')
views

创建数据库

from django.db import models
class UserInfo(models.Model):
    uid = models.AutoField(primary_key=True)
    username = models.CharField(max_length=32)
    pwd = models.CharField(max_length=64)
    age = models.IntegerField()
根据app的models.py生成数据库表
        python manage.py makemigrations
        python manage.py migrate

自定义配置数据库

 1  DATABASES = {
 2                         'default': {
 3                         'ENGINE': 'django.db.backends.mysql',
 4                         'NAME':'dbname',
 5                         'USER': 'root',
 6                         'PASSWORD': 'xxx',
 7                         'HOST': '',
 8                         'PORT': '',
 9                         }
10                     }
配置数据库

 数据库基本操作

类---》数据库的表

字段----》列

对象---》一行数据

查:

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

删:

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

增:

models.UserInfo.objects.create(username=u,pwd=p,age=a)

改:

obj = models.UserInfo.objects.filter(uid=uuid).update(username=u,pwd=p,age=a)

模板引擎

基本语法
取值:return render(request,'xx.html',{v:[1234]})
{{v.2}}

{% for i in d%}
{{i}} -->循环所有key
{%endfor%}
{% for k,v in d.items%}
{{k}} --{{v}}
{%endfor%}


特殊规则:
- 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
- 模板的继承

- 7. include
- 导入公共组件

Cookie和Session

obj = redirect(‘、home’)

obj.set_cookie('uuuu',u,max-age=10) 设置cookie超时时间10s

v= request.COOKIES.get(‘uuuuu’)  获取cookie

session 服务器端保存的键值对  key是随机字符串

request.session['user'] =u

前者是用户浏览器上的一个键值对,后者是放在服务器端的键值对

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

}
注销:
request.session.clear()
return redirect('/login/')
settings里面设置
 1  SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
 2      
 3     SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
 4     SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
 5     SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
 6     SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
 7     SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
 8     SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
 9     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
10     SESSION_SAVE_EVERY_REQUEST = True                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

ORM操作

models.UserInfo.objects.all()   返回Queryset类型(特殊的列表,每一行就是一个userinfo对象)

models.UserInfo.objects.values('name','pwd')  内部元素是字典

models.UserInfo.objects.values_list('name','pwd')   内部元素是列表

 models.UserInfo.objects.filter(name='alex')  条件过滤,取到的是对象

 models.UserInfo.objects.filter(name='alex').values(...)    变成字典

models.UserInfo.objects.get(name='alex')  获取一个元素,没有找到和找到多了 都会报错

models.UserInfo.objects.filter(name='alex').first()  获取一个元素,如果有多个取第一个,没有返回None

class DePart(models.Model):
title = models.CharField(max_length=16)

class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
dp = models.ForeignKey("DePart")

 正向查询:

q = models.UserInfo.objects.all()
q = models.UserInfo.objects.all().only('id','name') #只取
q = models.UserInfo.objects.all().defer('id','name')   #不取


for row in q:
print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title)
q = models.UserInfo.objects.values('username','password','dp__title')
q = models.UserInfo.objects.values_list('username','password','dp__title')
print(q)
反向查询:
q = models.UserInfo.objects.all()
for row in q:
print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title)
q = models.UserInfo.objects.values('username','password','dp__title')
q = models.UserInfo.objects.values_list('username','password','dp__title')
print(q)
v = models.DePart.objects.all()
for row in v:
print(row.id,row.title,row.userinfo_set.values('username'))
print(row.id,row.title,row.userinfo_set.all())
v1 = models.DePart.objects.values('id','title','userinfo__username')
for row1 in v1:
print(row1)
总结:
all方法(对象):正向跨表查询用字段.字段,比如,row.dp.title;反向查询用小写的表名_set,例如:row.userinfo_set.all()
values和values_list方法(字典,元组):正向跨表查询用字段__字段,比如 dp__title;反向查询用小写表名__字段,例如:userinfo__username

 通用分页功能

1     
6     
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """  
 4 @Author:Liumj
 5 @file: page.py 
 6 @time: 2018/1/6 0:01 
 7 """
 8 """
 9 使用方式:
10     all_count = models.UserInfo.objects.all().count()
11     page_info = PageInfo(request.GET.get('p'),10,all_count,request.path_info)
12     user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]
13 
14     return render(request,'users2.html',{'user_list':user_list,'page_info':page_info})
15 """
16 
17 class PageInfo(object):
18     def __init__(self,current_page,per_page_num,all_count,base_url,page_range=9):
19         """
20 
21         :param current_page: 当前页
22         :param per_page_num: 每页显示数据条数
23         :param all_count:  数据库总个数
24         :param base_url:  页码标签前缀
25         :param page_range: 页面最多显示的页码个数
26         """
27         try:
28             current_page = int(current_page)
29         except Exception as e:
30             current_page = int(1)
31         self.current_page = current_page
32         self.per_page_num = per_page_num
33         self.all_count = all_count
34         self.base_url = base_url
35         a,b = divmod(self.all_count,self.per_page_num)
36         if b !=0:
37             self.all_page = a+1
38         else:
39             self.all_page = a
40         self.page_range = page_range
41     def start(self):
42         return (self.current_page - 1) * self.per_page_num
43     def end(self):
44         return self.current_page * self.per_page_num
45     def page_str(self):
46         page_list = []
47         first_page = '
  • 首页
  • ' %(self.base_url,1) 48 page_list.append(first_page) 49 if self.current_page <=1: 50 prev_page = '
  • 上一页
  • ' 51 else: 52 prev_page = '
  • 上一页
  • ' %(self.base_url,self.current_page-1) 53 page_list.append(prev_page) 54 55 if self.all_page <=self.page_range: 56 start = 1 57 end = self.all_page + 1 58 else: 59 if self.current_page >int(self.page_range/2): 60 if self.current_page + int(self.page_range/2) > self.all_page: 61 start = self.all_page - self.page_range + 1 62 end = self.all_page + 1 63 else: 64 start = self.current_page - int(self.page_range/2) 65 end = self.current_page + int(self.page_range/2) + 1 66 else: 67 start = 1 68 end = self.page_range + 1 69 for i in range(start,end): 70 if self.current_page == i: 71 temp = '
  • %s
  • ' %(self.base_url,i,i) 72 else: 73 temp = '
  • %s
  • ' %(self.base_url,i,i) 74 page_list.append(temp) 75 76 if self.current_page >= self.all_page: 77 next_page = '
  • 下一页
  • ' 78 else: 79 next_page = '
  • 下一页
  • ' %(self.base_url,self.current_page+1) 80 page_list.append(next_page) 81 82 end_page = '
  • 尾页
  • ' % (self.base_url, self.all_page) 83 page_list.append(end_page) 84 85 return "".join(page_list)

     

    form表单

    功能:

    验证用户请求

    自动生成html(保留上次提交内容)

    字段:

            CharField(字符串)   EmailField(邮件格式)  IntergerField(整型,数字格式)  GenericIPAdderessField(IP格式)    FiledField(文件) ChoiceField(多选) RegexField(自定义字符串)

    插件:

         widgets.TextInput 

        widgets.PasswordInput
         widgets.Textarea

    widgets.Select(attrs={'class': 'form-control'},choices=[(1,'普通用户'),(2,"超级用户")])
    widgets.SelectMultiple(attrs={'class': 'form-control'},choices=[(1,'普通用户'),(2,"超级用户")])

    widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))

    widget=widgets.CheckboxInput()
    widget=widgets.CheckboxSelectMultiple()

    widget=widgets.FileInput()

     FK表:

    问题:数据源无法实时更新

    重写构造函数

    def __init__(self,*args,**kwargs):
        super(UserForm,self).__init__(*args,**kwargs)
        self.fields['ut_id'].widget.choices = models.UserType.objects.values_list('id','name')

     1 from django import forms
     2 from django.forms import  fields
     3 from django.forms import widgets
     4 class UserForm(forms.Form):
     5     username = fields.CharField(required=True,error_messages={'required':"用户名必填"},
     6                                 widget = widgets.TextInput(attrs={'class':'form-control'}))
     7     password = fields.CharField(required=True,error_messages={'required':"密码必填"},
     8                                 widget=widgets.TextInput(attrs={'class': 'form-control'}))
     9     email = fields.EmailField(required=True,error_messages={'required':"邮箱必填",'invalid':"邮箱格式错误"},
    10                               widget=widgets.TextInput(attrs={'class': 'form-control'}))
    11 
    12 def add_user(request):
    13     if request.method == 'GET':
    14         obj = UserForm()
    15         return  render(request,'add-user.html',{'obj':obj})
    16     else:
    17         #获取用户提交的数据
    18         #数据和正则进行验证
    19         obj = UserForm(request.POST)
    20         if obj.is_valid():
    21             print("验证通过",obj.cleaned_data)
    22 
    23         else:
    24             pass
    25             # print("错误信息",obj.errors["username"][0])
    26             # print("错误信息",obj.errors["password"][0])
    27             # print("错误信息",obj.errors["email"][0])
    28         return render(request,'add-user.html',{'obj':obj})
    表单

    缓存

    配置(内存缓存方式),全局配置

     1 CACHES = {
     2             'default': {
     3                 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
     4                 'LOCATION': 'unique-snowflake',
     5                 'TIMEOUT':300,
     6             },
     7         'OPTIONS': {
     8                 'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)
     9                  'CULL_FREQUENCY': 10,#缓存达到最大个数时,剔除缓存个数的比例
    10     }}

    1.全站缓存

    MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware', #第一行
    。。。。。。。。。。。。。。
    'django.middleware.cache.FetchFromCacheMiddleware', #最后一行
    ]

    2.单独试图函数缓存

    1 from django.views.decorators.cache import cache_page
    2 # Create your views here.
    3 @cache_page(10)  #缓存时间10s
    4 def index(request):+
    5     ctime = time.time()
    6     return  render(request,'index.html',{'ctime':ctime})

    3.局部模板缓存

     1 {% load cache %}
     2 DOCTYPE html>
     3 <html lang="en">
     4 <head>
     5     <meta charset="UTF-8">
     6     <title>Titletitle>
     7 head>
     8 <body>
     9     {% cache 5000 xxx %}
    10     <h1>{{ ctime }}h1>
    11     {% endcache %}
    12     <h3>{{ ctime }}h3>
    13 
    14 body>
    15 html>

    综合练习

     1 from django.shortcuts import render
     2 from django.shortcuts import redirect
     3 from django.shortcuts import HttpResponse
     4 from cmdb import models
     5 
     6 # Create your views here.
     7 def users(request):
     8     v = request.session.get('username')
     9     if not v:
    10         return redirect('/cmdb/login')
    11     server_list = models.UserInfo.objects.all()
    12     return render(
    13         request,
    14         'server1.html',
    15         {'server_list':server_list,'current_user':v}
    16     )
    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         models.UserInfo.objects.create(username=u,pwd=p,age=a)
    25         return redirect('/cmdb/users')
    26 def del_user(request):
    27     if request.method == "GET":
    28         uuid =request.GET.get('uid')
    29         models.UserInfo.objects.filter(uid=uuid).delete()
    30         return redirect('/cmdb/users')
    31 def edit_user(request):
    32     if request.method == "GET":
    33         uuid = request.GET.get('uid')
    34         obj = models.UserInfo.objects.filter(uid =uuid).first()
    35         return render(request,'edit_user.html',{"obj":obj})
    36     elif request.method == 'POST':
    37         uuid = request.POST.get('uid')
    38         u = request.POST.get('user')
    39         p = request.POST.get('pwd')
    40         a = request.POST.get('age')
    41         obj = models.UserInfo.objects.filter(uid=uuid).update(username=u,pwd=p,age=a)
    42         return redirect('/cmdb/users')
    43 def edit_user_new(request,uuid):
    44     if request.method == 'GET':
    45         obj=models.UserInfo.objects.filter(uid=uuid).first()
    46         return render(request,'edit_user_new.html',{'obj':obj})
    47     elif request.method == 'POST':
    48         u = request.POST.get('user')
    49         p = request.POST.get('pwd')
    50         a = request.POST.get('age')
    51         obj = models.UserInfo.objects.filter(uid=uuid).update(username=u, pwd=p, age=a)
    52         return redirect('/cmdb/users')
    53 def upload(request):
    54     if request.method == "GET":
    55         return render(request,'upload.html')
    56     elif request.method == "POST":
    57         obj = request.FILES.get('up')
    58         import os
    59         #f = open(os.path.join('upload',obj.name),'wb')
    60         f = open(os.path.join('upload', obj.name), 'wb')
    61         #f = open(obj.name,'wb')
    62         for line in obj.chunks():
    63             f.write(line)
    64         f.close()
    65         return HttpResponse('...')
    66 def tpl(request):
    67     return render(request,'tpl.html',{'sum':'nihaohelloljdfskadl;dkj;lj'})
    68 def group(request):
    69     return render(request,'group.html')
    70 def login(request):
    71     if request.method == 'GET':
    72         return render(request,'login.html')
    73     elif request.method == 'POST':
    74         u = request.POST.get('user')
    75         p = request.POST.get('pwd')
    76         obj = models.UserInfo.objects.filter(username=u,pwd=p)
    77         if obj:
    78             obj = redirect('/cmdb/users')
    79             #obj.set_cookie(key='user_name', value=u, max_age=10)
    80             request.session['username'] = u
    81             return obj
    82         else:
    83             return render(request,'login.html',{'msg':'用户名或密码错误'})
    views
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Liumj
     4 from django.conf.urls import url,include
     5 from django.contrib import admin
     6 from cmdb import views
     7 
     8 urlpatterns = [
     9     url(r'^users$',views.users),
    10     url(r'^add_user$',views.add_user),
    11     url(r'^del_user$',views.del_user),
    12     url(r'^edit_user$',views.edit_user),
    13     url(r'^edit_user_new-(?P\d+).html$',views.edit_user_new,name='nnn'),
    14     url(r'^upload$',views.upload),
    15     url(r'^tpl.html$',views.tpl),
    16     url(r'^group$',views.group),
    17     url(r'^login$',views.login),
    18 ]
    urls




    相关