zoukankan      html  css  js  c++  java
  • 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     <nav aria-label="...">
    2             <ul class="pagination">
    3                 {{ page_info.page_str|safe }}
    4             </ul>
    5         </nav>
    6     </div>
     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 = '<li><a href="%s?p=%s">首页</a></li>' %(self.base_url,1)
    48         page_list.append(first_page)
    49         if self.current_page <=1:
    50             prev_page = '<li><a href="#">上一页</a></li>'
    51         else:
    52             prev_page = '<li><a href="%s?p=%s">上一页</a></li>' %(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 = '<li class="active"><a href="%s?p=%s">%s</a></li>' %(self.base_url,i,i)
    72             else:
    73                 temp = '<li><a href="%s?p=%s">%s</a></li>' %(self.base_url,i,i)
    74             page_list.append(temp)
    75 
    76         if self.current_page >= self.all_page:
    77             next_page = '<li><a href="#">下一页</a></li>'
    78         else:
    79             next_page = '<li><a href="%s?p=%s">下一页</a></li>' %(self.base_url,self.current_page+1)
    80         page_list.append(next_page)
    81 
    82         end_page = '<li><a href="%s?p=%s">尾页</a></li>' % (self.base_url, self.all_page)
    83         page_list.append(end_page)
    84 
    85         return  "".join(page_list)
    View Code

     

    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>Title</title>
     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<uuid>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




  • 相关阅读:
    超级迷宫我的计划表
    不敢死队
    Let the Balloon Rise
    Hangover
    汉诺塔系列2
    Tri Tiling(递推)
    Tiling(递推,高精度)
    Color Me Less
    I Think I Need a Houseboat(圆计算)
    Kbased Numbers(递推)
  • 原文地址:https://www.cnblogs.com/liumj0305/p/6544710.html
Copyright © 2011-2022 走看看