您的位置:时时app平台注册网站 > 编程知识 > django功底之二时时app平台注册网站

django功底之二时时app平台注册网站

2019-12-06 10:50

通过字符串导入模块

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com

temp = "re"
model = __import__(temp)


def main():
    txt = "hj123uo"
    pattern = model.compile(r"[0-9] ")
    print(model.search(pattern, txt).group())


if __name__ == '__main__':
    main()

时时app平台注册网站 1

Not Found

当一个URL没有被找到时,Flight将会调用notFound方法。该方法默认的行为是
发出一个通用的HTTP 404 Not Found响应并带有简单的说明信息。

出于你自己的需要,你可以重写这个行为:

Flight::map('notFound', function(){
    // 处理not found
});

        其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

以字符串的形式使用模块的方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com

temp = "re"  # 要引入的模块
func = "compile"  # 要使用的方法
model = __import__(temp)  # 导入模块
function = getattr(model, func)  # 找到模块中的属性


def main():
    txt = "hj123uo"
    pattern = function(r"[0-9] ")  # 这里执行funcation()就等于执行re.compile()函数
    print(model.search(pattern, txt).group())


if __name__ == '__main__':
    main()

时时app平台注册网站 2

JSON

Flight对发送JSON和JSONP响应提供了支持。发送一个JSON响应时,你传递的数据将被JSON编码。

Flight::json(array('id' => 123));

对于JSONP请求,你可以选择传递查询参数名(query parameter name)用于定义你的回调函数:

Flight::jsonp(array('id' => 123), 'q');

所以,当使用?q=my_func构造一个GET请求时,你应该会收到这样的输出:

my_func({"id":123});

如果你没有传递查询参数名(query parameter name)的话,它会有一个默认名jsonp

from django.conf.urls import url,include

urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]

什么是反射

反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法:

  • getattr 获取指定字符串名称的对象属性
  • setattr 为对象设置一个对象
  • hasattr 判断对象是否有对应的对象(字符串)
  • delattr 删除指定属性

attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。

反射常常用在动态加载模块的场景中。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com

class TestObj(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def displayName(self):
        print("displayName方法执行,打印姓名:", self.name)



def AAA(self):
    print("I am AAA.")


def main():
    to = TestObj("Tom", 23)
    # 查看 to 实例里面是否有 name 这个属性
    if hasattr(to, "name"):
        print("实例 to 中有 name 属性。")
        print(getattr(to, "name"))
    else:
        print("实例 to 中没有 name 属性。")

    if hasattr(to, "displayName"):
        print("实例 to 中有 displayName 属性。")
        getattr(to, "displayName")()
    else:
        print("实例 to 中没有 displayName 属性。")

    if hasattr(to, "AAA"):
        print("实例 to 中有 AAA 属性。")
        getattr(to, "AAA")()
    else:
        print("实例 to 中没有 AAA 属性,将会设置。")
        setattr(to, "AAA", AAA)  # 参数:实例、方法名称、具体方法  相当于 to.AAA = AAA 第一个AAA是函数在实例中的名称, 第二个AAA是把哪个函数放进去,两者只是恰好这里名称一样

        # to.AAA(to)  # 这里一定要主动传递一个实例进去,因为它不会自动装配self
        getattr(to, "AAA")(to)


if __name__ == '__main__':
    main()

AAA是动态装载到实例里面去的。

时时app平台注册网站 3

可能有些人还没明白反射,反射就是把字符串反射成内存对象,看下面的例子

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com


class TestObj(object):
    def __init__(self, name):
        self.name = name


def displayname(self):
    print(self.name)


def main():
    to = TestObj(name="Tom")

    cmd = input("输入:")
    if hasattr(to, cmd):
        pass
    else:
        setattr(to, cmd, displayname)
        func = getattr(to, cmd)
        func(to)


if __name__ == '__main__':
    main()

时时app平台注册网站 4

根据用户输入来调用函数(这个函数肯定要提前的真实存在)。我这里无论我输入什么都可以执行上面的displayname方法。现在应该明白字符串映射到方法了吧。

ETag

ETag缓存与Last-Modified类似,但你可以对资源指定任意的id。

Flight::route('/news', function(){
    Flight::etag('my-unique-id');
    echo 'This content will be cached.';
});

需要记住的是,不论调用了lastModified或是etag,都会设置并且检查缓存的值。如果缓存中的值
跟请求的相同,Flight会立即发送一个HTTP 304响应并且停止处理。

             {% block  模块名称 %}

反射到底有什么用?

上面使用re.compile()函数的整个过程看起来很麻烦,但是你要知道这就等于实现了动态加载和执行所需要的模块或方法而不需要全部写入到PY文件中,当然具体需要执行的方法你也要提前实现。典型的使用场景就是web的URL路由。目前所有的web框架的URL路由基本都是这个原理。
用户输入不同的URL如何加载不同的PY文件以及调用里面的方法呢?你想一想Django里面,它并不是这样的,它依然需要你设置URL以及该URL对应的PY文件,为什么?因为这样调试方便,当然你能力足够也可以给它改写成反射的机制。

扩展方法

Flight::start() // 开启框架(接收响应开始工作)
Flight::stop() // 框架停止并且发送返回响应
Flight::halt([$code], [$message]) // 停止框架并返回一个可选的http状态码和信息
Flight::route($pattern, $callback) // 将一个URL匹配到一个回调中
Flight::redirect($url, [$code]) // 重定向到另一个URL
Flight::render($file, [$data], [$key]) // 渲染模板文件
Flight::error($exception) // 发送HTTP 500响应
Flight::notFound() // 发送HTTP 404响应
Flight::etag($id, [$type]) // 运行HTTP Etag缓存
Flight::lastModified($time) // 运行HTTP last modified缓存
Flight::json($data, [$code], [$encode]) // 发送JSON响应
Flight::jsonp($data, [$param], [$code], [$encode]) // 发送JSONP响应

任何通过mapregister添加的自定义方法都可以被过滤。

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

反射使用

License

Flight is released under the MIT license.

        redirect("路径")

重写(Overriding)

Flight允许你按照自己的需要去重写它的默认功能,而不用修改任何框架的代码。

例如,当Flight的路由功能没有匹配到一个URL时,它会调用notFound方法,发出一个通用的
HTTP 404响应。你可以使用map方法去重写这个行为。

Flight::map('notFound', function(){
    // 显示自定义的404页面
    include 'errors/404.html';
});

Flight也允许你替换这个框架的核心组件。例如你可以将默认的Router类替换成你自定义的类:

// 注册成你自定义的类
Flight::register('router', 'MyRouter');

// When Flight loads the Router instance, it will load your class
// 当Flight加载Router实例时,将会加载到你自定义的类
$myrouter = Flight::router();

然而框架的方法诸如mapregister是不能够被重写的。如果你尝试这么做的话你会得到一个error。

                7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值

路由

Flight中的路由是指将一个URL模式(pattern)匹配到一个回调函数中。

Flight::route('/', function(){
    echo 'hello world!';
});

只要能被调用,都可以当做回调函数。所以可以使用一个普通的函数当做回调:

function hello(){
    echo 'hello world!';
}

Flight::route('/', 'hello');

也可以是某一个类的方法:

class Greeting {
    public static function hello() {
        echo 'hello world!';
    }
}

Flight::route('/', array('Greeting','hello'));

如果定义了多个路由,路由依照定义它们的顺序进行匹配。第一个匹配到该请求的路由将被调用。

                6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值

变量

Flight允许你定义变量,使得它能在应用内的任何地方被使用。

// 保存你定义的变量
Flight::set('id', 123);

// 在应用的其他地方使用
$id = Flight::get('id');

去检测一个变量是否被设置了可以这么做:

if (Flight::has('id')) {
     // Do something
}

去清除一个变量你可以这么做:

// 清除这个id变量
Flight::clear('id');

// 清除所有的变量
Flight::clear();

Flight框架使用变量的目的还包括了配置。

Flight::set('flight.log_errors', true);

  3.app01.views.py

需求

Flight需要PHP 5.3或更高版本。

                可选的要传递给视图函数的默认参数(字典形式)

错误(Errors)和异常(Exceptions)

所有的errors和exceptions都会被Flight捕获,然后传到error方法。该方法默认的行为是
发出一个带有错误信息的通用的HTTP 500 Internal Server Error响应。

出于你自己的需要,你可以重写这个行为:

Flight::map('error', function(Exception $ex){
    // 错误处理
    echo $ex->getTraceAsString();
});

默认情况下,错误(errors)是不会被记录日志到web服务器的。你可以通过改变配置来允许记录。

Flight::set('flight.log_errors', true);
def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

HTTP缓存

Flight为HTTP级别的缓存提供了内建的支持。如果满足缓存的条件,Flight将会返回一个
HTTP304 Not Modified响应。当下一次客户端请求相同的资源时,它们会被提示去使用它们
本地的缓存版本。

            {% extends "base.html" %}

方法的映射

你可以使用map函数去映射你自定义的方法:

// 映射你自己的方法
Flight::map('hello', function($name){
    echo "hello $name!";
});

// 调用你的自定义方法
Flight::hello('Bob');

            http请求:HttpRequest对象

核心方法

Flight::map($name, $callback) // 创建一个自定的框架方法
Flight::register($name, $class, [$params], [$callback]) //将一个类注册成框架方法
Flight::before($name, $callback) // 添加框架方法的前置过滤器
Flight::after($name, $callback) // 添加框架方法的后置过滤器
Flight::path($path) // 添加类自动加载(autoloading)的路径
Flight::get($key) // 获取某个变量的值
Flight::set($key, $value) // 设置变量的值
Flight::has($key) // 某个变量是否被设值
Flight::clear([$key]) // 清除一个变量
Flight::init() // 初始化框架到默认的设定
Flight::app() // 获取整个应用对象的实例

            url(r'^manage/(?P<name>w*)/(?P<id>d*)', views.manage),  

配置

你可以使用set方法去设置配置的值,来自定义Flight的某些行为。

Flight::set('flight.log_errors', true);

下面是所有的可进行设置的配置列表:

flight.base_url - 覆盖该请求的base url。(默认值:null)
flight.handle_errors - 允许Flight处理所有的内部错误。 (默认值:true)
flight.log_errors - 向web服务器的错误日志文件里记录错误日志。 (默认值:false)
flight.views.path - 包含视图模板文件的目录路径。 (默认值:./views)

   

可选参数

你可以通过将URL段(segments)包在括号里的方式来指定哪些命名参数是可选的。

Flight::route('/blog(/@year(/@month(/@day)))', function($year, $month, $day){
    // 它将匹配如下URLS:
    // /blog/2012/12/10
    // /blog/2012/12
    // /blog/2012
    // /blog
});

任何没有被匹配到的可选参数将以NULL值传入。

class NewType(models.Model):
    caption = models.CharField(max_length=16)


    def get_absolute_url(self):
        """
        为每个对象生成一个URL
        应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
        :return:
        """
        # return '/%s/%s' % (self._meta.db_table, self.id)
        # 或
        from django.urls import reverse
        return reverse('NewType.Detail', kwargs={'nid': self.id})

安装

1.框架下载

如果你在使用Composer,你可以运行如下命令:

composer require mikecao/flight

或者你可以直接下载,之后将Flight框架文件放入你的web目录中。

  1. 配置你的web服务器

对于Apache服务器,编辑你的.htaccess文件添加如下内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

对于Nginx服务器,添加如下内容到你的server声明中:

server {
    location / {
        try_files $uri $uri/ /index.php;
    }
}
  1. 创建你的index.php文件(示例)

首先引入这个框架。

require 'flight/Flight.php';

接着定义一个路由并且注册一个函数去处理对应请求。

Flight::route('/', function(){
    echo 'hello world!';
});

最后,启动框架。

Flight::start();

1、模版的执行

框架的实例

替代将Flight运行成一个全局的静态类,你可以选择将它运行成一个对象的实例。

require 'flight/autoload.php';

use flightEngine;

$app = new Engine();

$app->route('/', function(){
    echo 'hello world!';
});

$app->start();

也就是取代调用静态方法,你可以调用Engine对象实例里同名的方法。

 {% for %}

自定义视图

Flight允许你替换默认的视图引擎,只需简单的注册你自己的视图类即可。这里展示的是在视图中
如何使用Smarty模板引擎:

// 加载Smarty类库
require './Smarty/libs/Smarty.class.php';

// 将Smarty注册成视图类
// 同时传递一个回调函数,在加载过程中配置Smarty
Flight::register('view', 'Smarty', array(), function($smarty){
    $smarty->template_dir = './templates/';
    $smarty->compile_dir = './templates_c/';
    $smarty->config_dir = './config/';
    $smarty->cache_dir = './cache/';
});

// 模板中数据的赋值
Flight::view()->assign('name', 'Bob');

// 显示这个模板
Flight::view()->display('hello.tpl');

出于完备性,你还应该重写Flight的默认render方法:

Flight::map('render', function($template, $data){
    Flight::view()->assign($data);
    Flight::view()->display($template);
});

            url(r'^home', views.home, name='h1'),

过滤

Flight允许你在方法调用之前和之后去过滤它。框架里没有任何你需要记住的预定义的钩子。你可以
过滤任何被映射的自定义方法和框架中的方法。

一个过滤器函数是像这样的:

function(&$params, &$output) {
    // Filter code
}

通过传入的变量,你可以操作输入参数和/或输出参数。

这样做就可以在一个方法运行之前运行一个过滤器:

Flight::before('start', function(&$params, &$output){
    // Do something
});

这样做就可以在一个方法运行之后运行一个过滤器:

Flight::after('start', function(&$params, &$output){
    // Do something
});

你可以给任何函数添加任意数量的过滤器。它们将按照声明的顺序依次被调用。

这里是一个过滤器处理的例子:

// 映射一个自定义的方法
Flight::map('hello', function($name){
    return "Hello, $name!";
});

// 添加一个前置的过滤器
Flight::before('hello', function(&$params, &$output){
    // 操作这里的params
    $params[0] = 'Fred';
});

// 添加一个后置的过滤器
Flight::after('hello', function(&$params, &$output){
    // 操作这里的output
    $output .= " Have a nice day!";
});

// 调用这个自定义方法
echo Flight::hello('Bob');

这个将会输出:

Hello Fred! Have a nice day!

如果你定义了多个过滤器,你可以通过在任意一个过滤器函数中返回false来终结这个过滤器链。

Flight::before('start', function(&$params, &$output){
    echo 'one';
});

Flight::before('start', function(&$params, &$output){
    echo 'two';

    // 如下将会终止这个过滤器链
    return false;
});

// 这里将不会得到调用
Flight::before('start', function(&$params, &$output){
    echo 'three';
});

记住,核心函数诸如mapregister是不能够被过滤的,因为它们是被直接调用而非动态调用的。

d、使用simple_tag和filter(如何调用)

正则表达式

在路由中你可以使用正则表达式:

Flight::route('/user/[0-9] ', function(){
    // 这个将匹配到 /user/1234
});

                        }

Flight是什么?

Flight是一个快速,简易,可扩展的PHP框架。Flight能使你快速和轻松地创建RESTful Web应用。

require 'flight/Flight.php';

Flight::route('/', function(){
    echo 'hello world!';
});

Flight::start();

            http响应:HttpResponse对象

布局(Layouts)

对网站来说,拥有一个单独的可交换内容的布局(layout)模板文件是很常见的。要在布局中使用渲染的内容,
你可以给render函数传递一个可选的参数。

Flight::render('header', array('heading' => 'Hello'), 'header_content');
Flight::render('body', array('body' => 'World'), 'body_content');

紧接着你的视图就有了命名为header_contentbody_content的已保存的变量。接下来你就可以
这样渲染你的布局了:

Flight::render('layout', array('title' => 'Home Page'));

如果你的模板文件是这样的:

header.php:

<h1><?php echo $heading; ?></h1>

body.php:

<div><?php echo $body; ?></div>

layout.php:

<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $header_content; ?>
<?php echo $body_content; ?>
</body>
</html>

输出会是:

<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Hello</h1>
<div>World</div>
</body>
</html>

        我们制作某个页面,想让其他页面也继承一些样式,可以将此页面设置成模板。

视图

Flight默认提供了一些基础的模板功能。调用带有模板文件和
可选的模板数据的render函数,去显示一个视图模板。

Flight::render('hello.php', array('name' => 'Bob'));

你传进来的模板数据,会被自动的注入到模板当中,并且可以像一个本地变量一样去引用。
模板文件就是简单的PHP文件。如果一个文件名为hello.php的模板文件的内容是这样的:

Hello, '<?php echo $name; ?>'!

输出会是:

Hello, Bob!

你可以使用set函数来手动的设置视图中的变量:

Flight::view()->set('name', 'Bob');

这个name 变量现在在你所有的视图中都是可用的了。所以就可以简化成这样了:

Flight::render('hello');

注意当你在render函数中指定模板名时,你可以去掉这个.php的扩展名。

默认情况下Flight会在views目录下寻找模板文件。你可以通过如下配置的设定来为你的模板
设置另外一个路径。

Flight::set('flight.views.path', '/path/to/views');

                一个正则表达式字符串

停止

你可以通过调用halt方法在任何地方停止这个框架:

Flight::halt();

你也可以指定可选的HTTP状态码和信息:

Flight::halt(200, 'Be right back...');

调用halt将会丢弃在那个点之前的任何的响应内容。如果你想停止这个框架并输出当前的响应,使用stop方法:

Flight::stop();

一、什么是架构?

命名参数

你可以在路由中指定命名参数,它们会被传递到你的回调函数里。

Flight::route('/@name/@id', function($name, $id){
    echo "hello, $name ($id)!";
});

你也可以通过使用:分隔符在命名变量中引入正则表达式

Flight::route('/@name/@id:[0-9]{3}', function($name, $id){
    // 这个将匹配到 /bob/123
    // 但是不会匹配到 /bob/12345
});

            'USER': 'root',

重定向(Redirects)

你可以使用redirect方法将当前请求重定向到传入的新URL中。

Flight::redirect('/new/location');

默认情况下Flight会发出一个HTTP 303状态码。你可以选择设置一个自定义的状态码。

Flight::redirect('/new/location', 401);

              正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

JSON 输入

如果你发送application/json类型的请求并带有数据{"id": 123}时,它将被从data属性中获取到。

$id = Flight::request()->data->id;

二、MVC和MTV

扩展

Fligth被设计成一个可扩展的框架。这个框架带来了一系列的默认方法和组件,但是它允许你
映射你自己的方法,注册你自己的类,甚至可以重写已有的类和方法。

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

错误(Error)处理

 

路由信息

如果你想检视匹配到的路由信息,可以请求将路由对象传递到你的回调函数中:你需要把
route方法的第三个参数设置成true。这个路由对象总是会作为最后一个参数传入你的回调函数。

Flight::route('/', function($route){
    // 匹配到的HTTP方法的数组
    $route->methods;

    // 命名参数数组
    $route->params;

    // 匹配的正则表达式
    $route->regex;

    // Contains the contents of any '*' used in the URL pattern
    $route->splat;
}, true);
  • v = reverse('app01:detail', kwargs={'pk':11})
  • {% url 'app01:detail' pk=12 pp=99 %}

HTTP METHOD路由

在默认不指定的情况下,路由会对相应请求的所有Method(例如:GET POST PUT DELETE...)进行匹配。你可以通过在URL前面加一个方法标识符的方式来响应指定的Method。

Flight::route('GET /', function(){
    echo 'I received a GET request.';
});

Flight::route('POST /', function(){
    echo 'I received a POST request.';
});

你还可以使用|分隔符来映射多个Method到同一个回调中。

Flight::route('GET|POST /', function(){
    echo 'I received either a GET or a POST request.';
});

        4.2、基于正则的路由 1 2      

类的注册

你可以使用register函数去注册你自己的类:

// 注册你定义的类
Flight::register('user', 'User');

// 得到你定义的类的一个实例
$user = Flight::user();

register方法允许你向类的构造函数传递参数。所以当你加载自定义类的时候,它将会
预初始化(pre-initialized)。你可以通过一个追加的数组来传递定义的构造函数参数。
这是一个加载数据库连接的例子:

// 注册一个带有构造函数参数的类
Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=test','user','pass'));

// 得到你定义的类的一个实例
// 这里将创建一个带有你定义的参数的对象
//
//     new PDO('mysql:host=localhost;dbname=test','user','pass');
//
$db = Flight::db();

如果你传递了额外的回调函数参数,它将会在类构造完之后立即执行。这就允许你为这个新对象去
执行任何的安装过程(set up procedures)。这个回调函数会被传递一个参数,就是这个新对象的实例。

// 这个回调函数将会传递到这个被构造的对象中
Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=test','user','pass'), function($db){
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
});

默认情况下,每次你加载一个类,你会得到一个共享的实例。如果要得到一个类的新实例,
简单的传递一个false参数就行了。

// 类的共享实例
$shared = Flight::db();

// 类的新实例
$new = Flight::db(false);

需要记住的是,被映射的方法优先于被注册的类。如果你用相同的名字将它们都声明了,那么只有
映射的方法会被调用。

        4.4、为路由映射设置名称

请求体原始数据(RAW Request Body)

要获取原始的HTTP请求体数据,举例来说当你正在处理PUT方法的请求时,你可以这么做:

$body = Flight::request()->getBody();

        模板使用方式:

通配符

匹配只发生在单独的URL段(segments)。如果你想匹配多段,可以使用*通配符。

Flight::route('/blog/*', function(){
    // 这个将匹配到 /blog/2000/02/01
});

要将所有的请求路由到单一的回调上,你可以这么做:

Flight::route('*', function(){
    // Do something
});

            {% block  模块名称 %}

框架的方法

Flight框架被设计成易于使用和易于理解的。下面就是这个框架完整的方法集合。它由 是常规静态函数
的核心方法,和被映射的可以被过滤和重写的扩展方法组成。

时时app平台注册网站 5时时app平台注册网站 6

请求

Flight将HTTP请求封装到一个单独的对象中,你可以这样获取到它:

$request = Flight::request();

request对象提供了如下的属性:

url - 被请求的url
base - The parent subdirectory of the URL
method - 请求的Method (GET, POST, PUT, DELETE)
referrer - 引用(referrer)的 URL
ip - 客户点的IP地址
ajax - 是否是一个ajax请求
scheme - 服务器scheme (http, https)
user_agent - 浏览器信息
type - Content-type
length - Content-length
query - 查询字符串参数(Query string parameters)
data - Post数据或者JSON数据
cookies - Cookies数据
files - 上传的文件
secure - Whether the connection is secure
accept - HTTP accept parameters
proxy_ip - 客户端代理ip地址

你可以通过数组或对象的方式来获取query,data,cookiesfiles属性。

也就是说,你可以这样获取到查询字符串参数(query string parameter):

$id = Flight::request()->query['id'];

或者你可以这样做:

$id = Flight::request()->query->id;

                   是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                  没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                  可以通过user的is_authenticated()方法来辨别用户是否登陆:
                  if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                  时该属性才可用

Last-Modified

你可以使用lastModified方法并传递一个UNIX时间戳去设置一个页面最后被修改的日期和时间。
客户端将继续使用它们的缓存直到last modified的值被改变了。

Flight::route('/news', function(){
    Flight::lastModified(1234567890);
    echo 'This content will be cached.';
});

        {% with %}:用更简单的变量名替代复杂的变量名

路由的传递

当从一个被匹配到的回调函数中返回true时,路由功能将继续执行,传递到下一个能匹配的路由中。

Flight::route('/user/@name', function($name){
    // 检查某些条件
    if ($name != "Bob") {
        // 延续到下一个路由
        return true;
    }
});

Flight::route('/user/*', function(){
    // 这里会被调用到
});

        import pymysql

        4.5、根据app对路由规则进行分类 

            url(r'^index/(d*)', views.index), 

            url(r'^index/(d*)', views.index, name='h2'),             

                    内容

模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。

View Code

                  {{ list.0 }}   {{ dic.name }}

      

                {% include %}

                1  add          :   给变量加上相应的值 

时时app平台注册网站 7时时app平台注册网站 8

       此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

         session:    

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

        http请求中产生两个核心对象:

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

时时app平台注册网站 9时时app平台注册网站 10

 {% load my_tags %}    
<ul>{% for obj in list %} 
<li>{{ obj.name }}</li>{% endfor %}</ul>
#在标签里添加reversed来反序循环列表:  
  {% for obj in list reversed %}    ...    {% endfor %}
#{% for %}标签可以嵌套:  
  {% for country in countries %}     
   <h1>{{ country.name }}</h1>   
     <ul>         {% for city in country.city_list %}     
       <li>{{ city }}</li>         {% endfor %}        </ul>    {% endfor %}
#系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量,
#这个变量含有一些属性可以提供给你一些关于循环的信息1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1:    {% for item in todo_list %}        <p>{{ forloop.counter }}: {{ item }}</p>    {% endfor %}2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为03,forloop.revcounter4,forloop.revcounter05,forloop.first当第一次循环时值为True,在特别情况下很有用:        {% for object in objects %}            {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}            {{ object }}           </li>      {% endfor %}     
 # 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了# 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
# Django会在for标签的块中覆盖你定义的forloop变量的值# 在其他非循环的地方,你的forloop变量仍然可用
#{% empty %}{{li }}      {%  for i in li %}          <li>{{ forloop.counter0 }}----{{ i }}</li>      {% empty %}          <li>this is empty!</li>      {% endfor %}#         [11, 22, 33, 44, 55]#            0----11#            1----22#            2----33#            3----44#            4----55

            }

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

View Code

            'NAME':'数据库名字',

更多见文档:

时时app平台注册网站 11时时app平台注册网站 12

时时app平台注册网站 13时时app平台注册网站 14

View Code

         path:请求页面的全路径,不包括域名
         method:请求中使用的HTTP方法的字符串表示。全大写表示。例如
                if  req.method=="GET":
                     do_something()
                    elseif req.method=="POST":
                    do_something_else()
         GET:         包含所有HTTP GET参数的类字典对象
         POST:       包含所有HTTP POST参数的类字典对象
             服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
              HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
              if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"
    
        COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
        FILES:包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
                  filename:      上传文件名,用字符串表示
                  content_type:   上传文件的Content Type
                  content:       上传文件的原始内容
        user:       

        urlpatterns = [    url(正则表达式, views视图函数,参数,别名),]          

   4.1、单一路由对应

五、模板:

#实例:
#value1="aBcDe"
{{ value1|upper }}
<br>
#value2=5
{{ value2|add:3 }}
<br>
#value3='he  llo wo r ld'
{{ value3|cut:' ' }}
<br>
#import datetime
#value4=datetime.datetime.now()
{{ value4|date:'Y-m-d' }}
<br>
#value5=[]
{{ value5|default:'空的' }}
<br>
#value6='<a href="#">跳转</a>'
{{ value6 }}{% autoescape off %}  {{ value6 }}{% endautoescape %}{{ value6|safe }}
<br>
{{ value6|striptags }}
#value7='1234'{{ value7|filesizeformat }}
<br>
{{ value7|first }}
<br>
{{ value7|length }}
<br>{{ value7|slice:":-1" }}
<br>
#value8='http://www.baidu.com/?a=1&b=3'{{ value8|urlencode }}
<br>    
value9='hello I am yuan'

        3.3模板配置路径

            直接写需要修改的块,不写默认全部继承模板的内容

{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

                  {{obj|filter:param}}   

            {% endblock %}

三、Django的配置文件

            url(r'^web/',include('web.urls')),

  1.project.urls.py

如果默认的filter不能满足使用,可以自定义.

        

           如果需要使用模板的内容,又想添加一些内容,可以如下设置

 2. app01.urls.py

  

  • 模板中使用生成URL     {% url 'h2' 2012 %}
  • 函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
  • Model中使用获取URL  自定义get_absolute_url() 方法

        3.2数据库引擎配置

   

  URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。 

                3  capfirst     :    首字母大写

著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。

            'HOST': '',#默认是本地

        框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)

        {% url %}:  引用路由配置的地址

            在使用模板时候使用

                一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

View Code

                {{ name }}    {{ age }}

时时app平台注册网站 15

时时app平台注册网站 16时时app平台注册网站 17

        STATICFILES_DIRS = (

       Model(模型):负责业务对象与数据库的对象(ORM)

*  {% if %} 条件语句*

        这个接口就是WSGI:Web Server Gateway Interface。

        参数说明:      

            'PORT': '3306',

  4.6、命名空间

            唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
      HttpResponse对象      

           5.2.1 使用双大括号来引用变量

            url(r'^manage/(?P<name>w*)', views.manage,{'id':333}),  

时时app平台注册网站 18时时app平台注册网站 19

        

        locals():    可以直接将函数中所有的变量传给模板

       Template(模版):负责如何把页面展示给用户

{% if num >= 100 and 8 %}
{% if num > 200 %} 
<p>num大于200</p>
{% else %}
<p>num大于100小于200</p>
{% endif %}
{% elif num < 100%}
<p>num小于100</p>
{% else %}
<p>num等于100</p>
{% endif %}{% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,
例如下面的标签是不合法的:{% if obj1 and obj2 or obj3 %}

View Code

        最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

  获取请求匹配成功的URL信息:request.resolver_match

            )

            {%  block  模块名称  %} 

        pymysql.install_as_MySQLdb()

            {% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容

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

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
)

{%csrf_token%}:csrf_token标签

View Code

四、路由系统:

Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表:

             {% endblock %}

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

 a、在app中创建templatetags模块(必须的) 

        用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效

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

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

            'PASSWORD': 'xxx',

import datetime
from django import template
import DjangoDemo.settings

now = datetime.datetime.now()
fp = open(settings.BASE_DIR '/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html

                2  addslashes   :    给变量中的引号前加上斜线

View Code

        

             {% endblock %}

                一个可选的name参数

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

return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

        在需要继承模板的页面第一行添加以下内容才可以继承

                4  cut          :   从字符串中移除指定的字符

                修改的内容

  设置名称之后,可以在不同的地方调用,如:

                 变量的过滤器(filter)的使用

 

 

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

                修改的内容

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户

        {% load %}: 加载标签库 

        TEMPLATE_DIRS = (

 c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :

        DATABASES = {

         将需要修改的内容 

        render_to_response(),

View Code

  

                深度变量的查找(万能的句点号)

六、模板继承

#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1   v2   v3

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

        4.3、添加额外的参数 

时时app平台注册网站 20时时app平台注册网站 21

        3.1配置静态文件路径,为了django找到本地的文件

from django.conf.urls import url
from app01 import views

app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>d )/$', views.detail, name='detail')
]

2模板的写法

            'default': {

            将路由指定到web项目下的urls文件去再分发

                5  date         :   格式化日期字符串

    

        render()(推荐)

        如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

            )

       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

七、视图 views.py

            'ENGINE': 'django.db.backends.mysql',

本文由时时app平台注册网站发布于编程知识,转载请注明出处:django功底之二时时app平台注册网站

关键词: