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




  • 相关阅读:
    JavaScript 为字符串添加样式 【每日一段代码80】
    JavaScript replace()方法 【每日一段代码83】
    JavaScript for in 遍历数组 【每日一段代码89】
    JavaScript 创建用于对象的模板【每日一段代码78】
    html5 css3 新元素简单页面布局
    JavaScript Array() 数组 【每日一段代码88】
    JavaScript toUTCString() 方法 【每日一段代码86】
    位运算
    POJ 3259 Wormholes
    POJ 3169 Layout
  • 原文地址:https://www.cnblogs.com/liumj0305/p/6544710.html
Copyright © 2011-2022 走看看