Django框架

1 自己开发Web框架

开发Web框架涉及的内容

  • socket

  • http协议

    无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了

  • HTML知识

  • 数据库(pymysql,SQLAlchemery)

互联网的通信都是基于sock进行通信的
HTTP:无状态、短连接
TCP:不断开
WEB应用(网站):

HTTP协议:

发送:
				POST /index HTTP/1.1
				Host: 127.0.0.1:8080
				Connection: keep-alive
				Cache-Control: max-age=0
				Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
				User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
				HTTPS: 1
				Accept-Encoding: gzip, deflate, sdch
				Accept-Language: zh-CN,zh;q=0.8
				Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni


				p=123
			
响应:
				200 OK
				Cache-Control:public, max-age=15
				Connection:keep-alive
				Content-Encoding:gzip
				Content-Type:text/html; charset=utf-8
				Date:Wed, 14 Jun 2017 01:21:17 GMT
				Expires:Wed, 14 Jun 2017 01:21:33 GMT
				Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
				Transfer-Encoding:chunked
				Vary:Accept-Encoding
				X-Frame-Options:SAMEORIGIN
				X-UA-Compatible:IE=10
						
				
				
				用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)

浏览器(socket客户端)
2. www.cnblogs.com (42.121.252.58,80)
sk.socket()
sk.connect((42.121.252.58,80))

			sk.send('我想要xx')
		5. 接收
		6. 连接断开

博客园(socket服务端)
1. 监听ip和端口(42.121.252.58,80)
while True:
用户 = 等待用户连接
3. 收到'我想要xx'
4. 响应:“好”
用户断开

下面的代码构成了一个简单的web框架:

import socket

sock = socket.socket()
sock.bind(('127.0.0.1',8080))
sock.listen(5)

while True:
    conn,addr = sock.accept() # hang住
    # 有人来连接了
    # 获取用户发送的数据
    data = conn.recv(8096)
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
    conn.send(b'123123')
    conn.close()

2 Django 框架配置

2.1 新建Django工程

2.1.1 在cmd中建立工程

django-admin startproject 工程名
Python3 manage.py runserver

2.2 设置HTML模板路径

新建HTML的模板存放的文件templates,之后在setting配置文件中添加templates的路径:

'DIRS': [os.path.join(BASE_DIR,'templates')],

2.3 配置静态文件路径

静态文件包括css文件,js文件,图片等
新建静态文件static(可以是别的名字),在setting文件中添加

STATIC_URL = '/static/'
STATICFILES_DIRS =(
    os.path.join(BASE_DIR,'static'), #这里是拼接存放css文件的路径,修改路径的名字时,会自动修改
)

注意:

  • 拼接路径,最后用逗号,否则会报错
  • 这里的static代表前缀,在HTML文件中引入css文件的时候在前面添加,
<link rel="stylesheet" href="/static/comments.css"> 这里的static是前缀

2.4注释一句

这里先把setting中下面的一句话注释

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',
]

2.5 django工程目录

mysite
   | - mysite    ===============对整个程序进行配置
      |  - __init__.py
      |  - settings.py    ============配置文件
      |  - url.py        ==============URL对应关系
      |  - wsgi.py        ============遵循WSGI规范,上线一般使用uwsgi+nginx
   | - manage.py    ============管理Django程序    : python manage.py
                                                            : python manage.py startapp xxx
                                                            : python manage.py makemigrations
                                                            : python manage.py migrate

 

3 Django 路由系统

路由系统是对URL进行的配置,urls.py文件中进行操作

from django.shortcuts import HttpResponse,render

def login(request):  
	# 需要加参数request,拿到所有的内容
    return HttpResponse('hello') # 封装的对象  直接返回内容

def index(request): 
    return render(request,'index.html')# render 加request参数和HTML文件

urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^login/', login),
    url(r'^index/', index), # index是函数名
]

4 模板标记

HTML文件在django中是作为模板使用的,因为涉及数据的交互,所以是动态的,通常是把内容添加到HTML中。在HTML中是通过特殊符号进行占位的,称为模板标记。

模板的原理是:http是传输的过程中国是通过响应头和相应体进行通信的。中间是两个换行符。传输的是字节,模板是通过字符拼接的,形成完整的响应体

在django中是通过{{ }}对模板进行添加的

添加的方式:

  • 通过字典的方式
  • 通过列表取,索引用. 的方法
  • 通过for循环取

能够和HTML结合起来使用

<body>
    <h1>index</h1>
    <p>{{ name }}</p>
    <p>{{ users.0 }}</p>
    <p>{{ users.1 }}</p>
    <p>{{ user_dict.k1 }}</p>
    <p>{{ user_dict.k2 }}</p>
    <p>循环</p>
    <ul>
        {% for item in users %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>

    <table border="1px">
        {% for row in user_list_dict %}
            <tr>
                <td>{{ row.id }}</td>
                <td>{{ row.name }}</td>
                <td>{{ row.email }}</td>
                <td>
                    <a href="">编辑</a> |<a href="/del/?nid={{ row.id }}">删除</a>
                </td>
            </tr>

        {% endfor %}

    </table>


</body>
def index(request):
    return render(request, 'index.html',
                  {
                      'name':'abc',
                      'users':['aaa','bbb'],
                      'user_dict':{'k1':'v1','k2':'v2'},
                      'user_list_dict':[
                          {'id':1,'name':'aaa','email':'aaa@aaa.com'},
                          {'id':2,'name':'bbb','email':'bbb@bbb.com'},
                          {'id':3,'name':'ccc','email':'ccc@ccc.com'},
                      ]

                  })

return redirect('/index/') # 重定向才行 上面不行
使用render跳转不行

参考内容:

http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html

https://my.oschina.net/asktao/blog/894367

http://www.cnblogs.com/wupeiqi/articles/5237704.html

posted @ 2017-06-14 16:21  hzxPeter  阅读(289)  评论(0编辑  收藏  举报