Django基础

I.什么是Web框架?

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

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

import socket

def handle_request(client):

    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK

".encode("utf8"))
    client.send("<h1>Hello World</h1>".encode("utf8"))

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8001))
    sock.listen(5)

    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

if __name__ == '__main__':

    main()
View Code

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

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

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

这个接口是 WSGI:Web Server Gateway Interface

      -------------------------------自己写 Web框架 -----------------------

urls

from views import *


URLpattern = (
    ("/login", login),
    ("/auth", auth),
    ("/alex", foo1),
    ("/egon", foo2),
    ("/reg", reg),

)
View Code

views

def foo1(request):
    f = open("templates/alex.html", "rb")
    data = f.read()
    f.close()

    return [data]


def foo2(request):
    f = open("templates/egon.html", "rb")

    data = f.read()
    f.close()

    return [data]


def login(request):
    f = open("templates/login.html", "rb")

    data = f.read()
    f.close()

    return [data]


def reg(request):
    pass

def auth(request):

    print("+++++",request)

    user_union,pwd_union=request.get("QUERY_STRING").split("&")
    _,user=user_union.split("=")
    _,pwd=pwd_union.split("=")

    if user=='Yuan' and pwd=="123":
        return ["登录成功".encode("utf8")]

    else:
         return [b"user or pwd is wrong"]
View Code

bin

from wsgiref.simple_server import make_server


from views import *
import urls

def routers():

    urls.URLpattern

    return URLpattern


def application(environ,start_response):

    path=environ.get("PATH_INFO")
    print("path",path)
    start_response('200 OK', [('Content-Type', 'text/html'),('Charset', 'utf8')])

    urlpattern=routers()
    func=None

    for item in urlpattern:
        if path==item[0]:
            func=item[1]
            break

    if func:

        return  func(environ)

    else:
        return [b"404"]




if __name__ == '__main__':

    t=make_server("",8800,application)
    t.serve_forever()
View Code

templates

  login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="dist/css/bootstrap.css">
</head>
<body>

<h2>登录页面</h2>

<form action="http://127.0.0.1:8800/auth">
    <p>姓名<input type="text" name="user"></p>
    <p>密码<input type="password" name="pwd"></p>
    <p>
        <input type="submit">
        
    </p>
</form>

</body>
</html>
View Code
1  django-admin  startproject project_name     创建项目

2  python manage.py startapp  appName          创建应用

3  python manage.py runserver IP PORT          启动项目

创建应用的方法二

 

II.Django框架简单创建

1.在cmd中输入(安装)

pip3 install django

      
2.操作命令:          

 # 创建Django程序
            django-admin startproject mysite
            # 进入程序目录
            cd mysite
            # 启动socket服务端,等待用户发送请求
            python manage.py runserver 127.0.0.1:8080

    python manage.py runserver  #默认 8000

运行他人的项目:

python manage.py runserver

3.Django程序目录

1.创建projec 

mysite
                mysite
                    - settings.py  # Django配置文件
                    - url.py       # 路由系统:url->函数
                    - wsgi.py      # 用于定义Django用socket, wsgiref,uwsgi
            
                # 对当前Django程序所有操作可以基于 python manage.py runserver
                manage.py  

2.配置

- 模板路径
                    template目录
                    
                    TEMPLATES = [
                        {
                            'BACKEND': 'django.template.backends.django.DjangoTemplates',
                            'DIRS': [os.path.join(BASE_DIR, 'template')],    #!!!
                            'APP_DIRS': True,
                            'OPTIONS': {
                                'context_processors': [
                                    'django.template.context_processors.debug',
                                    'django.template.context_processors.request',
                                    'django.contrib.auth.context_processors.auth',
                                    'django.contrib.messages.context_processors.messages',
                                ],
                            },
                        },
                    ]
                - 静态文件路径
                    static目录
                    
                    STATIC_URL = '/static/'
                    
                    STATICFILES_DIRS = (                #! ! ! 
                        os.path.join(BASE_DIR,'static'),
                    )
View Code

3.额外配置

MIDDLEWARE = [
                'django.middleware.security.SecurityMiddleware',
                'django.contrib.sessions.middleware.SessionMiddleware',
                'django.middleware.common.CommonMiddleware',
                #'django.middleware.csrf.CsrfViewMiddleware',
                'django.contrib.auth.middleware.AuthenticationMiddleware',
                'django.contrib.messages.middleware.MessageMiddleware',
                'django.middleware.clickjacking.XFrameOptionsMiddleware',
            ]
                
View Code

III.路由配置系统(URLconf)

URL配置(URLconf)就像Django所支撑网站的目录,本质是URL与要为该URl调用的视图函数之间的映射表;

 1.无名分组

url(r'^(d+)/', views.ti),

2.有名分组

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

url(r'^(?P<year>d{4})/(?P<month>d{2})$',views.have),

views.py

def have(request,month,year):

    return HttpResponse(year+'年  '+month+'月')

3.路由分发

#补充:

1.启动之前,先执行自己的py文件

 2.自定义的XXX.py

内容为:print(‘XXX’)

3.操作apps.py

#启动之前,去所有的app下,去找 XXX.py ,执行器中的代码

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

语法格式:      {{obj|filter:param}}
# 1  add          :   给变量加上相应的值
   #
   # 2  addslashes   :    给变量中的引号前加上斜线
   #
   # 3  capfirst     :    首字母大写
   #
   # 4  cut          :   从字符串中移除指定的字符
   #
   # 5  date         :   格式化日期字符串
   #
   # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
   #
   # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值


#实例:

#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'
View Code
原文地址:https://www.cnblogs.com/zhaochangbo/p/7009422.html