威尼斯www608ccdjango框架介绍,django框架

django框架介绍,django框架

主要内容

1.        Django框架发展

2.        Django架构,MTV模式

3.        开发流程

4.        开发实例——Poll

python下各种框架

一个完整的Web应用框架包括下面功能的支持

服务发布

URL分发

模板支持

数据库处理

Python框架一般都支持前3个方面,按对4个功能的支持情况分类如下:

平台性框架:不依赖数据库,更关注服务的高校构建和运行平台的稳定。代表性框架:Zope和Twisted

轻小型框架:认为数据库不是应用的必要因素,更关注友好快速的简单任务的开发。代表性框架:Cherry,Quixote和web.py,没有内置的数据库支持模块。

一站式框架:认为数据库是应用的重要因素,关注如何仅基于本身快速实现一个功能性网站。代表性框架:Django,TurboGears

Django简介

Django(维基百科)
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django
Reinhardt来命名的。

Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t
Repeat
Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。

Django 于 2008年6月17日正式成立基金会。

Django吸引人的特点

在Python各种web框架中,Django的文档最完善、市场占有率最高、招聘职位最多!

优点

l  完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Djangobook)。

l  全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stackframework

  • batteries
    included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。

l  强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。

l  自助管理后台,admin
interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。

缺点(源自Django坚持自己造所有的轮子,整个系统相对封闭)

l  系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。

l  Django自带的ORM远不如SQLAlchemy强大,除了在Django这一亩三分地,SQLAlchemy是Python世界里事实上的ORM标准,其它框架都支持SQLAlchemy了,唯独Django仍然坚持自己的那一套。Django的开发人员对SQLAlchemy的支持也是有过讨论和尝试的,不过最终还是放弃了,估计是代价太高且跟Django其它的模块很难合到一块。

l  Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。

l  URL配置虽然强大,但全部要手写,这一点跟Rails的Conventionover
configuration的理念完全相左,高手和初识Django的人配出来的URL会有很大差异。

l  让人纠结的auth模块,Django的auth跟其它模块结合紧密,功能也挺强的,就是做的有点过了,用户的数据库schema都给你定好了,这样问题就来了,比如很多网站要求email地址唯一,可schema里这个字段的值不是唯一的,纠结是必须的了。

l  Python文件做配置文件,而不是更常见的ini、xml或yaml等形式。这本身不是什么问题,可是因为理论上来说settings的值是能够动态的改变的(虽然大家不会这么干),但这不是最佳实践的体现。

Django大包大揽,用它来快速开发一些Web运用是很不错的。如果你顺着Django的设计哲学来,你会觉得Django很好用,越用越爽;相反,你如果不能融入或接受Django的设计哲学,你用Django一定会很痛苦,趁早放弃的好。

组件

Django框架的核心包括:一个 面向对象
的映射器,用作数据模型(以Python类的形式定义)和关联性数据库间的媒介;一个基于正则表达式的URL分发器;一个视图系统,用于处理请求;以及一个模板系统。

核心框架中还包括:

l 一个轻量级的、独立的Web服务器,用于开发和测试。

l 一个表单序列化及验证系统,用于HTML表单和适于数据库存储的数据之间的转换。

l 一个缓存框架,并有几种缓存方式可供选择。

l 中间件支持,允许对请求处理的各个阶段进行干涉。

l 内置的分发系统允许应用程序中的组件采用预定义的信号进行相互间的通信。

l 一个序列化系统,能够生成或读取采用XML或JSON表示的Django模型实例。

l 一个用于扩展模板引擎的能力的系统。

内置应用

Django 包含了很多应用在它的”contrib”包中,这些包括:

  • 一个可扩展的认证系统
  • 动态站点管理页面
  • 一组产生 RSS 和 Atom 的工具
  • 一个灵活的评论系统
  • 产生Google 站点地图 (Google Sitemaps)的工具
  • 防止跨站请求伪造(cross-site request forgery)的工具
  • 一套支持轻量级标记语言(Textile和Markdown)的模板库
  • 一套协助创建地理信息系统(GIS)的基础框架

服务的部署

Django 可以运行在启用了 mod python 的 Apache
2上,或是任何WSGI兼容的Web服务器。Django也有启动FastCGI服务的能力,因此能够应用于任何支持FastCGI的机器上。

下列数据库引擎被Django官方支持:

  • PostgreSQL
  • MySQL
  • SQLite
  • Oracle

MicrosoftSQL Server的适配器正在开发中,处于试验阶段。(注:SQL
Server的支持在1.0版本中已经被完全去除)

Django1.0已经可以利用Jython运行在任何J2EE服务器。

开发简单应用的步骤

1.  进入目标文件夹,建立项目django-admin.pystartproject 
mysite。Django框架自动为我们建立所需要的项目文件夹和一些配置文件

2.  进入项目文件夹,建立应用django-admin.py
startapppolls。Django框架会自动生成所需要的models.py和views.py等文件

3. 
编辑settings.py,将新建的应用Polls,加入到项目中,INSTALLEN_APPS加入一行,‘mysite.polls’,

4.  配置urls.py,加入期望的url规则,访问mysite.polls.views中的方法

5.  编辑views.py,编写2个方法

6.  启动内置开发服务器,django python manage.pyrunserver

7.       在浏览器中输入

 

1.  另注:数据库连接中。python
2.5及以后的版本内涵sqlite数据库,不需要另外安装。name是一定要是包含完整路径的文件名称。若文件原本不存在,在使用同步数据库后,系统会为每个应用自动创建所需要的table,其他数据库都必须填写用户名和密码,并且需要事先创建好数据库。

2. 
app可以放在任何python路径上。放在与manage.py同级目录中,将作为该工程的顶级模块,而不是mysite的子模块。

3. 
如果写view时采用硬编码方式,要改变页面显示方式,就要改变python代码。解决方案:利用template系统从python中分离出设计。解决方案:利用template系统从python中分离出设计

 

应用部署

详见Django book

Django框架开发效率

用django构建的网站

在该网站上可以获得一个应用网站的源码,以供学习参考。

l  欧洲一个日化网上商店

l  

l  焦点网站  焦点观察,与专家对话。框架非常适合

l  国际象棋俱乐部

l  代码管理网站 

参考资料

MVC模式,Django发展

跟 Python
本质上不同,Python是非常简约的语言

Web框架

Django官网

主要内容
1.Django框架发展 2.Django架构,MTV模式 3.开发流程 4.开发实例Poll
python下各种框架 一个完整的Web应用框架包…

一、web框架介绍:

python框架django基础指南,python框架django

Django简介:

Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。不过在Django实际使用中,Django更关注的是模型(Model)、模板(Template)和视图(Views),称为
MTV模式。Django的主要目的是简便、快速的开发数据库驱动的网站,它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件。

django是对象关系映射的 (ORM,object-relational
mapping):以Python类形式定义你的数据模型,ORM将模型与关系数据库连接起来,你可以通过简单的API操作数据库,同时你也可以在Django中使用原始的SQL语句。Django可以运行在Apache上,也可以运行在支持WSGI,FastCGI的服务器上。支持多种数据库,已经支持Postgresql,MySql,
Sqlite3,Oracle。

django安装

pip install Django

验证django的安装

import django
django.get_version()

创建一个django工程

django-admin.py startproject mysite

此时会自动生成一些目录和文件,最外层的manage.py,像是一个运行的入口,通过命令行的调用可以完成一些常用的功能,比如:

运行django的自带的web服务器:

python manage.py runserver http://127.0.0.1:8080

常用的同步或创建数据库表:

python manage.py syncdb

创建django project里面的子项目

python manage.py startapp polls

创建超级管理员:

python manage.py createsuperuser

还有setttings.py文件,是django的配置文件。

urls.py文件,是django用于匹配url的文件,哪个网址执行哪些后台代码(view)是在这里定义的。

Django MTV模式之—-modle模型

Django采用了orm模式(对象关系映射),django的模型根据数据库表的内容定义了一个python类,这个类里面的成员和每一个数据库表里的字段一一对应;

类里面的成员类型也和数据库表里的字段类型也是对应的,名字其实也可以起的一样,看起来比较直观。这样每个类实例就代表了数据库里面的一条数据。

模型例子(在models.py里定义):

from django.db import models

class Poll(models.Model):
  question = models.CharField(max_length=200)
  pub_date = models.DateTimeField('date published')

class Choice(models.Model):
  poll = models.ForeignKey(Poll)d
  choice_text = models.CharField(max_length=200)
  votes = models.IntegerField(default=0)

django设置数据库:

settings.py文件里面的database可以定义你要使用的数据库类型,比如:

定义数据库为sqlite

'ENGINE': 'django.db.backends.sqlite3'

定义数据库为mysql

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

执行django-admin.py startproject mysite, 然后再python manage.py
runserver
web服务器,可通过

manage.py syncdb,此时会根据定义的模型创建相应的数据库。

数据库操作例子:(假设File为定义的模型类)

获取所有数据:

all_filelist = File.objects.all()

获取所有数据并按某个字段排序:

all_filelist = File.objects.all().order_by('-id')

执行sql语句:

cursor = connection。cursor()
cursor.extcute("select * from info_path")
chaannels = cursor.fetchall()

过滤数据:

list=File.objects.all().filter(xxx=xxx)

根据主键查询

list=File.objects.all().get(id=1)

时间过滤:

results = File.objects.all().filter(time__range=(dayfrom, dayto))

创建新数据:

file = File(time=time,path=path,result=result)
file.save()

获取数据:

file.time
file.path

Django简介:
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视…

上一篇中了解了一些服务器端编程的基础知识, 本篇介绍python语言的web框架
django

django框架

威尼斯www608cc 1

 

1、框架介绍

  根据第一部分内容介绍,我们可以总结出一个web框架应该包含如下三部分:a.sockect服务、b.根据不同的url调用不同函数(包含逻辑)、c.返回内容(模板渲染)。常见的python
WEB框架有tornado(包含如上3部分,
Django(上述a部分为第三方的),flask(上述a和c为第三方的)。

2、Django安装

威尼斯www608cc 2

  什么是web框架:

    所有的web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。这样就可以实现web框架了。

import socket

sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen(5)


while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    conn.send(b"OK")
    conn.close()

总而言之web框架的原理就是这短短的十几行代码,当然用户浏览器向服务端发送数据怎么发,这个怎么定如果谁都能定岂不是乱套了,各有各的规则了,所以就有一个统一的规则,收发数据时候规定了格式,不能随便写,这就是HTTP协议,不管是收数据还是发数据都要按照这个协议的规则来。

如果想详细了解HTTP:请点击这里

每个HTTP都包含Header和Body两部分,其中Body是可选的,HTTP响应的响应头(Header)中有content_Type表明响应内容格式。如果响应的是网页,则content-Type的值为text/html

django学习教程和参考书

(强烈推荐自强学堂的django教程)
http://code.ziqiangxuetang.com/django/django-intro.html
http://www.runoob.com/django/django-install.html
http://python.usyiyi.cn/translate/django\_182/index.html

一、命令行方式

命令行创建django项目(首先将cd到django项目欲放置的位置):

威尼斯www608cc 3

 使用方法

进到要存放的文件夹目录

威尼斯www608cc 4

 

威尼斯www608cc 5

启动Django项目:
    命令行方式:
        python manage.py runserver 127.0.0.1:8888
        python manage.py runserver 8888

HTTP的请求方式:

我的文章的意义

服务端开发,python,django这些内容上面的链接中有详细的阐述.
我写的内容肯定没有上面的完备,准确.
我的文章的价值在于从一个iOS程序员的角度来理解服务端开发.
客户端程序员在学习服务端开发时可能会有一些知识盲点.
我遇到的知识盲点我会着重介绍.

目录介绍

威尼斯www608cc 6

  GET:

GET /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n

环境

操作系统 macOS Sierra 10.12.6
IDE PyCharm
python 3.5

配置文件

  模板文件配置:在python中创建一个django项目后,在项目文件夹下会多一个templates文件夹,主要用于存放html模板文件,若要准确找到引用的html文件,需要在setting文件中对此文件夹路径进行配置。如下:(利用pycharm创建django项目,pycharm会自动帮你创建)

 威尼斯www608cc 7

静态文件配置:在使用html模板文件时,其通常会有使用js或css等文件,这些文件称为静态文件,为了使其正常生效,我们也需要在setting文件进行相关配置,如下:

威尼斯www608cc 8

html文件中引用静态文件的方式如下:

威尼斯www608cc 9

  POST:

POST /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n
\r\n\r\n
请求体...

当遇到\r\n\r\n时,表示响应头结束了,以 后的数据全属于响应体。

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen(5)

while True:
    conn, addr = sock.accept()
    data = conn.recv(8096)
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n") #此行为响应头
    conn.send(b"OK")    #此行为响应体
    conn.close()


#这样就给简单的socket加上了HTTP规则,这样就算实现了一个web框架了

   通过上面用socket实现的简单的web框架足以说明,作为web框架一般分为两个部分:服务程序和应用程序。服务器其实就是起到对socket的封装,并在请求来时对请求的各种数据进行整理。常见的web:Django、Flask、web.py,不同的框架开发方式不同,但是它们开发的应用程序都要和服务器程序配合使用。

  由于框架有多种,服务器程序就需要提供多种不同的支持,这样的话局面会有点混乱,而能给这种情况整一个标准吗?当然有标准啦有了标准框架和服务器都支持这个标准,这样就可以配合工作了,这个标准这么厉害,它是什么呢?
  它就是传说中的WSGI(Web Server Gateway
Interface)它就是一种规范,它定义使用Python编写的web应用程序与web服务器程序之间的接口格式,实现应用于服务器程序间的解耦

常用的WSGI服务器有uwsgi、Gunicorn而Python标准库的独立WSGI服务器叫wsgiref,django就是用这个模块来做服务器的。

例如:

from wsgiref.simple_server import make_server


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8')])  # 设置HTTP响应的状态码和头信息
    return [bytes("<h1>Hello world!</h1>", encoding="utf8"),]


if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

  这样的话是不是有点太简单了点?这也是太简易了,导致用户输入url是无法对url进行处理,那能不能改进一下来接收并处理用户输入的url请求呢

改进版的简易框架:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    if url == "/index/":
        return [bytes("<h1>这是index页面</h1>", encoding="utf8"), ]
    elif url == "/home/":
        return [bytes("<h1>这是home页面</h1>", encoding="utf8"), ]
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]

if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

  这不就解决了用户输入URL的问题了吗,但是问题又来了,如果有很多页面呢,挨个判断吗?那也太麻烦了吧,当然会有更好的方法了:

from wsgiref.simple_server import make_server


def index():
    with open("index.html", "rb") as f:
        data = f.read()
    return [data, ]


def home():
    with open("home.html", "rb") as f:
        data = f.read()
    return [data, ]


# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
    ("/home/", home),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]


if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()
这不是及解决了不用url全都拿来判断,而且将整个html返回给浏览器了,服务器先打开HTML文件,将其转换为二进制,然后发给浏览器。

   这个页面是不是都写死了啊,那我要在页面上显示一些别的数据咋办呢?整个html文件换掉有点费事吧;怎样解决呢是不是需要做一个动态的HTML呢,那该怎样做呢
  这时候我们需要引进一个新的模块:jinja2   
  jinja2的作用:利用一些特殊的符号来替换要展示的数据,这些特殊符号就是通过ji9nja2来渲染的,说白了jinja2就是一个渲染页面的工具。
  

下载安装jinja2:
          pip install jinja2

举例说明:

威尼斯www608cc 10威尼斯www608cc 11

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
</head>
<body>
    <h1>姓名:{{name}}</h1>
    <h1>爱好:</h1>
    <ul>
        {% for hobby in hobby_list %}
        <li>{{hobby}}</li>
        {% endfor %}
    </ul>
</body>
</html>

index2.html页面

威尼斯www608cc 12威尼斯www608cc 13

from wsgiref.simple_server import make_server
from jinja2 import Template


def index():
    with open("index2.html", "r") as f:
        data = f.read()
    template = Template(data)  # 生成模板文件
    ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ]


def home():
    with open("home.html", "rb") as f:
        data = f.read()
    return [data, ]


# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
    ("/home/", home),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]


if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

用jinja2来渲染index.html

  对于去数据我们总不能一直把数据写在py文件中吧,我们是不是需要用数据库来存数据呢,数据库怎么用呢

威尼斯www608cc 14威尼斯www608cc 15

#一定记着首先要导入
import pymysql

conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")'''这里里是配置数据库用户名,密码,数据库名'''
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#这儿是将查出的数据转换为字典形式
cursor.execute("select name, age, department_id from userinfo")
#这里是执行sql语句,可以将SQL语句写在外面赋值给变量,这里面只写变量名
user_list = cursor.fetchall()
cursor.close()
conn.close()

pymysql的连接及使用方式

模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法法则写上,其内部就会按照制定语法进行相应的替换,从而达到动态的返回内容

创建django项目

首先 创建一个空白环境

mkvirtualenv -p /usr/local/bin/python3.5 python35 --no-site-packages

workon python35

pip install django

django-admin.py startproject HelloWorld

cd HelloWorld

django-admin.py startapp mytest

这样项目就创建好了.
运行一下试试.

workon python35
cd HelloWorld
ls
此时能看到manage.py 文件
如果看不到manage.py, 切换路径仔细找找. 总之cd到manage.py 文件所在目录
python manage.py runserver 8000

威尼斯www608cc 16

django0-firstrun.png

图中红色的警告信息的意思是数据库没有migration. 就是工程中有了数据库定义,
但是没有根据数据库定义的代码生成数据库表. 不过不影响此时的运行
此时随便打开一个浏览器地址栏输入http://localhost:8000
看到

威尼斯www608cc 17

django0-itworked.png

项目跑起来了.

停止运行: 同时按下Ctrl+C两个键.
这之后发现工程路径中多了一个文件

威尼斯www608cc 18

django0-sqlite3.png

是因为django初始时默认使用sqlite数据库, 我们以后会改为mysql的.

使用PyCharm打开项目(有IDE当然要用了)

威尼斯www608cc 19

django0-HelloWorld.png

简单介绍下PyCharm的运行和调试, 至少断点调试必须要会.

对pycharm来说有两处地方需要配置,
否则和我们刚刚创建的python35环境对不上号.

威尼斯www608cc 20

preference.png

图中选择刚刚创建的python35环境. 如果没有就手动创建一下(addLocal).
指向刚才创建的环境的bin/python就行.
上图中决定的是PyCharm进行代码提示的环境. 代码提示依赖个环境,
如果配置错误, PyCharm会提示很多不存在的错误.

第二处

威尼斯www608cc 21

django0-runconfig.png

威尼斯www608cc 22

django0-runconfig1.png

选择python35环境.

这里决定的run和debug时用来运行项目的python环境.

我填写的配置是将项目跑在localhost的8000端口上.
这样填写只能够本地访问.

django入门必学三招

威尼斯www608cc 23

调试

威尼斯www608cc 24

django0-debug0.png

威尼斯www608cc 25

django0-debug1.png

HttpResponse

:用于向服务器返回字符串(如启动服务后,在浏览器请求:127.0.0.1:8000/index/后,浏览器显示hello
world字符内容)

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse,render,redirect

def index(request): # 所有跟请求相关的数据,都保存在request
    return HttpResponse("<h1>hello world</h1>")

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^index/', index),
]

威尼斯www608cc 26

 

威尼斯www608cc 27

将项目跑起来并且能够在局域网中访问

workon python35
cd 到manage.py文件所在目录
python manage.py runserver 0.0.0.0:8000

此时理论上可以通过局域网访问项目.

但是django默认的settings.py 配置还有问题.
需要修改
settings.py 文件中的
ALLOWED_HOSTS = []
修改为
ALLOWED_HOSTS = [“*”,]

表示任何域名都可以访问本项目

修改之后重新 runserver项目. 即可通过局域网访问了.
例如下面的局域网地址.
http://192.168.0.43:8000

 (2)render

:用于渲染html文件,如启动服务后,在浏览器请求:127.0.0.1:8000/login/后,浏览器会显示login.html文件应被渲染出的结果

威尼斯www608cc 28urls.py

此过程中的错误点:

威尼斯www608cc 29

 

威尼斯www608cc 30

 redirect(具体要跳转的URl)

 

 

 

 

 

 

用django连接数据库,密码登录网站

威尼斯www608cc 31

 

威尼斯www608cc 32威尼斯www608cc 33

def login(request):
    # return HttpResponse("Hello World")
    # 判断request是否是POST方法
    error_msg = ' '
    if request.method == "POST":
        # 定义两个变量接收浏览器POST的数据
        name = request.POST.get("username")
        pwd = request.POST.get("password")
        # 与数据库建立连接
        # conn = pymysql.connect(host="localhost", database="day60", user="root", password="123456", charset="utf8")
        conn = pymysql.connect(**config)
        cursor = conn.cursor()
        # 查询语句,进行密码以及账号的认证
        sql = "SELECT * FROM userinfo WHERE NAME = %s AND pwd = %s;"
        try:
            ret = cursor.execute(sql, [name, pwd])
            if ret:
                return redirect("http://www.cnblogs.com/jassin-du/p/8270462.html")
            else:
                error_msg = "用户名密码错误"
        except Exception as e:
            print(e)

    return render(request, "login.html", {"key": error_msg})


urlpatterns = [
    url(r'^login/', login),
    url(r'^admin/', admin.site.urls),
    # url(r'^$', login),
]

urls.py文件

威尼斯www608cc 34威尼斯www608cc 35

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>登录</title>
    <link rel="stylesheet" href="../static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="/templates/login.html">
    <style>
        body {
            background-color: #eeeeee;
        }

        #login-form {
            margin-top: 100px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <form id="login-form" class="form-horizontal col-md-4 col-md-offset-4" action="login.html" method="post">
            <h3 class="text-center">请登录</h3>
            <div class="form-group">
                <label for="username" class="col-sm-2 control-label">账号</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="username" placeholder="账号" name="username">
                </div>
            </div>
            <div class="form-group">
                <label for="inputPassword" class="col-sm-2 control-label">密码</label>
                <div class="col-sm-10">
                    <input type="password" class="form-control" id="inputPassword" placeholder="Password" name="password">
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <div class="checkbox">
                        <label>
                            <input type="checkbox">记住我
                        </label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn-primary btn-block">登录</button>
                    <p style="color: red">{{key}}</p>
                </div>
            </div>
        </form>
    </div>
</div>
<script src="../static/jquery-3.2.1.min.js"></script>
</body>
</html>

HTML文件

威尼斯www608cc 36威尼斯www608cc 37

"""
Django settings for jgo项目 project.

Generated by 'django-admin startproject' using Django 1.11.8.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os




# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '7(_h_umn&5&k2u60h@_=-*k2@28d+!g)#pab2vqr*6v+gt0bha'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
#
ALLOWED_HOSTS = []


# Application definition

# 安装的app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 中间件
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',
]

# url 路由的某些配置
ROOT_URLCONF = 'jgo项目.urls'

# 模板相关的
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        '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',
            ],
        },
    },
]

#wsgi服务器网关
WSGI_APPLICATION = 'jgo项目.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

# 数据库相关
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

# 认证相关文件
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

# 静态文件(css 文件和 js文件) 存放的实际位置
STATIC_URL = '/static/'

# 静态文件(css文件和js文件) 存放的实际位置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,"static"),
    # os.path.join(BASE_DIR,"css"),
]

settings文件

 

相关文章