• Django学习笔记(一)


    1.安装Django,网站下载Django,https://www.djangoproject.com/download/,解压到python安装目录,用CMD进入django目录,输入 python setup.py install

    2.创建Django本地项目,将C:Python27Libsite-packagesdjangoin加入环境变量,新建一个文件夹DjangoDemo(命名可以随便的),CMD进入新建文件夹, 输入

    django-admin.py startproject mysite  即新建了一个Django 项目

    3.Django文件架构:

    setting文件用于项目的参数设置,例如debug,urls用于声明url对应的函数,views用于储存urls中url对应的函数,__init__.py一般为空,不需要修改。

    cmd中输入

    >python manage.py runserver

    运行服务器

    4.urls文件说明

    from django.conf.urls import patterns, include, url
    
    from django.contrib import admin
    #admin.autodiscover()  这句不知道有什么用
    import views
    
    urlpatterns = patterns('',
    
        (r'^$', views.hello), (r'^%', views.hello1), (r'^$', views.hello1 )) #当访问http://127.0.0.1:8000/hello是程序会运行views里面的hello函数,‘hello’是一个正则表达式

    一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。 从现在开始,本文所有URL模式都用原始字符串

    5.views文件说明

    from django.http import HttpResponse
    
    def hello(request):
           return HttpResponse("hello world")
    def hello1(request):
        return HttpResponse("hello world1")

    函数必须有一个参数request,可以通过这个类访问http请求相关的数据,例如参数,路径等

    6.从url中提取数据

    #urls.py中的代码
    
    (r'^num/(d+)$', printNum),
    
    #views.py中的代码 def printNum(request,num):
        return HttpResponse("hello i am %s"%num)

    效果为访问http://127.0.0.1:8000/num/252   会返回hello i am 252

    正则表达式中可以通过()来提取数据,(r'^num/(d+)$', printNum),会提取括号里面的数据作为printNum中的一个参数,所以printNum有两个参数

    7.模板

    需要在setting.py文件中添加模板路径

    TEMPLATE_DIRS = (  
        './mysite/t/',
    )#.代表manage.py所在的目录

    views.py中的代码为:

    def hello(request):
        return render_to_response('hello.html', {'list1':[1,2,5,4]})

    html:

    <html>
        <body>
            hello world
            {%for i in list1%}
            {{i}}
            {%endfor%}
        </body>
    </html>

    一个网上的html代码demo:

    <html>
    <head><title>Ordering notice</title></head>
    
    <body>
    
    <h1>Ordering notice</h1>
    
    <p>Dear {{ person_name }},</p>
    
    <p>Thanks for placing an order from {{ company }}. It's scheduled to
    ship on {{ ship_date|date:"F j, Y" }}.</p>
    
    <p>Here are the items you've ordered:</p>
    
    <ul>
    {% for item in item_list %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
    
    {% if ordered_warranty %}
        <p>Your warranty information will be included in the packaging.</p>
    {% else %}
        <p>You didn't order a warranty, so you're on your own when
        the products inevitably stop working.</p>
    {% endif %}
    
    <p>Sincerely,<br />{{ company }}</p>
    
    </body>
    </html>

     语句要加空格

    {% if text == 'prepare_data' %}
     
    模板中对字典的访问方法是比较局限的
    例如访问字典的name值
    python:
    person['name']
    模版:
    person.name
    但是如果字典的key是一个变量
    python可以这样:
    key='name'
    person[key]
    但是模版是访问不了的
    所以就要对数据进行一定的转换
    例如
    python
    names=['zhangsan','lisi']
    name_age={'zhangsan':45,'lisi':78,'wangwu':75}
    for name in names:
        print name,name_age[name]

    模版

    #python语句
    names=['zhangsan','lisi']
    name_age={'zhangsan':45,'lisi':78,'wangwu':75}
    persons=[{'name':name,'age':name_age[name]} for name in names]
    
    #模版语句
    {% for person in persons %}
    <p>{{person.name}}</p>
    <p>{{person.agent}}</p>

    Python 的“真值”

    在Python和Django模板系统中,以下这些对象相当于布尔值的False 

    • 空列表([] 空元组(() ) 空字典({} ) 空字符串('' ) 零值(0 ) 特殊对象None 对象False(很明显)

    • 提示:你也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。

    除以上几点以外的所有东西都视为`` True``

    模板继承

    一般网站中的html都有一般分时固定的,例如导航栏,导入相应css,js文件等,django中可以用模板继承来实现

    先新建一个基础模板base.html

    <html>
        <body>
            hello world
            {%block content%} {%endblock%}
            hello world
            {%block time%} {%endblock%}
        </body>
    </html>

    再建一个子模板child1.html:

    {% extends "base.html"%}
    {% block content%}i am content from child1{%endblock%}        
    {% block time%}  i am time from child2{%endblock%}
        

    views中的函数:

    def hello1(request):
        return render_to_response('child1.html' )

    这样返回的结果为:

    <html><head></head><body>
        hello world
        i am content from child1
        hello world
        i am time from child2
    </body></html>

     8.表单

    属性/方法说明举例
    request.path 除域名以外的请求路径,以正斜杠开头 "/hello/"
    request.get_host() 主机名(比如,通常所说的域名) "127.0.0.1:8000" or "www.example.com"
    request.get_full_path() 请求路径,可能包含查询字符串 "/hello/?print=true"
    request.is_secure() 如果通过HTTPS访问,则此方法返回True, 否则返回False True 或者 False

    HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)

    HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

    REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)

    除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息: request.GET 和 request.POST。二者都是类字典对象,可以通过它们来访问GET和POST数据。

    form类

    django中通过request,如request.POST["key1"]获取数据,如果不存在key1这个值,django会跳出异常,所以对于每一个key,都需要这样写:

    if "key1" in request.POST:
        key1=request.POST["key1"]

    以防止跳出异常,但是如果key非常多的时候,这样就很麻烦,所以django就引入form类

    1)创建一个form类,在views.py文件的同级目录下,创建form.py

    from django import forms
    
    class demoForm(forms.Form):
        name=forms.CharField()
        age=forms.NumberInput()
        fav=forms.CharField()
      

    这里声明了三个字段,可以在每个字段的声明中加入参数, required=False,表示不是必须的,max_length=100,表示最大长度为100,,等等

    2.判断form是否合乎规则

    form = demoForm(request.POST)
    if form.is_valid():
        name=request.POST["name"]

    form.is_valid()方法会判断form是否合乎规则,是就返回True

    2.自定义校验规则

    例如需要指定age的长度要小于3,就需要在demoForm类下加入方法,clean_age(),如果合乎规则,就返回age,否则抛出异常。校验规则的方法必须以clean_开头。(为什么是clean,跟检验有什么关系吗?)

       def clean_age(self):
            age= self.cleaned_data[age]
            agel = len(age.split())
            if agel< 3:
                raise forms.ValidationError("age too old!")
            return age

    9.会话与认证

    cookies

    request.COOKIES

    response.set_cookie("mycookies", "eeee")

    session

    request.session["fav_color"] = "blue"   设置SESSION

    fav_color = request.session["fav_color"]  获取SESSION

    del request.session["fav_color"]   删除SESSION

    def setsession(request):
        request.session["name"]="kevin"
        return HttpResponse("done")
    def getsession(request):
        name=request.session["name"]
        return HttpResponse(name)

    10.重定向

    from django.http import HttpResponseRedirect
    
    return HttpResponseRedirect("/get_server")

    11.视图高级用法

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'hours_ahead'),
    )
    
    urlpatterns += patterns('weblog.views',
        (r'^tag/(w+)/$', 'tag'),
    )

    12.静态文件的配置方法,

    由于Django每个版本的静态文件配置方法都不同(我也是醉了。。。),所以需要根据项目使用的版本来选择配置方法,详情参考:

    http://my.oschina.net/u/877170/blog/293613

     参考资料:http://djangobook.py3k.cn/2.0/chapter05/

  • 相关阅读:
    批处理处理oracle数据库脚本导入
    Log4Net 配置说明
    MSSQL和oracle数据通讯
    计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]
    newagg新蛋笔试题
    Oracle数据库切换SQLServer数据库解决方案
    sqlserver 的事务和c#的事务
    SQL Server 2005 导出 数据脚本
    ASP.NET CMD WebShell
    Silverlight BUG
  • 原文地址:https://www.cnblogs.com/Xjng/p/3556931.html
Copyright © 2020-2023  润新知